web-dev-qa-db-fra.com

Laravel - Erreur de type: Trop peu d'arguments?

Je reçois une erreur:

Erreur de type: trop peu d'arguments

Je pensais que Laravel ferait un peu de magie si les arguments ne sont pas complètement transmis

Par exemple:

Dans le contrôleur, j'ai:

public function create(CreateRequest $request)
{
    return $this->todoService->createList($request);
}

Dans la classe todoService:

use App\Plan

class todoService {   

    public function createList($request, Plan $plan)
    {
      //
    }
}

Comme vous pouvez le constater, je n’ai pas passé l'objet de classe Plan. Dois-je me lier ou quelque chose?

5
I'll-Be-Back

Si vous appelez createList () par vous-même, vous devrez transmettre les deux paramètres vous-même. Vous pouvez lier quelque chose avec Plan, mais néanmoins, si vous appelez quelque chose qui n'est pas Laravel, vous serez alors responsable de transmettre les paramètres de cette fonction.

Ce type de conseil ne fonctionne que si Laravel appelle cette fonction. Vous devez donc appeler ces fonctions via Laravel.

Si vous essayez d'injecter automatiquement dans le constructeur d'une classe, vous pouvez simplement faire ceci:

$service = $this->app->make('App\Plan\todoservice');

ou 

$service = App::make('App\Plan\todoservice');

ou 

$service = resolve('App\Plan\todoservice');

Mais cela ne fonctionnera que pour les constructeurs. Veuillez noter que vous pouvez également fournir des paramètres comme arguments suivants de la fonction make() ou resolve().

En fait, différentes méthodes peuvent également être appelées de cette façon.

Vous pouvez simplement faire:

    $service = App::make('App\Plan\todoservice');
    $container->call([$service, 'createList'], ['request' => $request] );

Ici, $container est un objet de Illuminate\Contracts\Container\Container.

4
Hafiz

Laravel ne peut faire aucune magie à ce niveau car votre erreur de code est simplement une erreur de syntaxe PHP. Vous indiquez que le second paramètre est de type Plan, ce qui le rend obligatoire implicitement. Laravel ne peut pas «patcher» des appels de fonction simples comme celui-ci.

Votre confusion est probable en ce sens que, selon votre routage, Laravel peut injecter le paramètre Plan correct dans la méthode du contrôleur create, vous permettant ainsi de le transférer dans le service.

1
Niels Keurentjes

Vous devez bind classes uniquement si elles dépendent des interfaces. Si vous spécifiez une classe particulière, réflexion fera le travail pour vous. Documentation

La seule façon pour que cela fonctionne est de définir la valeur par défaut du deuxième paramètre. Dans toute autre situation, une exception de syntaxe sera levée.

use App\Plan

class todoService    
{  
    public function createList($request, Plan $plan = null)
    {
      //
    }
}

public function create(CreateRequest $request)
{
    return $this->todoService->createList($request);
}

Cela fonctionnera, mais cela aura-t-il un sens? 

1
wujt

1

/**
 * Create a new personal access token for the user.
 *
 * @param  string  $name
 * @param  array  $scopes
 * @return \Laravel\Passport\PersonalAccessTokenResult
 */
public function createToken($name, array $scopes = [])
{
    return Container::getInstance()->make(PersonalAccessTokenFactory::class)->make(
        $this->getKey(), $name, $scopes
    );
}

/**
 * Set the current access token for the user.
 *
 * @param  \Laravel\Passport\Token  $accessToken
 * @return $this
0
edfgdfgdfg