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?
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
.
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.
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?
/**
* 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