我收到错误:
类型错误:参数太少
如果争论没有完全通过,我认为Laravel会有一些魔力吗?
例如:
在控制器中我有:
public function create(CreateRequest $request)
{
return $this->todoService->createList($request);
}
在todoService
课程中:
use App\Plan
class todoService {
public function createList($request, Plan $plan)
{
//
}
}
如您所见,我没有传递Plan
类对象。我必须绑定什么吗?
答案 0 :(得分:5)
如果你自己调用createList(),那么你需要自己传递这两个参数。你可以用Plan绑定一些东西,但是如果你要调用的东西不是Laravel,那么你将负责传递那些函数参数。
此类型提示仅在Laravel调用该函数时有效。所以你需要通过Laravel调用这些函数。
如果您尝试自动注入类的构造函数,则只需执行此操作:
$service = $this->app->make('App\Plan\todoservice');
或
$service = App::make('App\Plan\todoservice');
或
$service = resolve('App\Plan\todoservice');
但这只适用于构造函数。请注意,您还可以提供参数作为make()
或resolve()
函数的下一个参数。
事实上,也可以通过这种方式调用不同的方法。
您可以这样做:
$service = App::make('App\Plan\todoservice');
$container->call([$service, 'createList'], ['request' => $request] );
此处$container
是Illuminate\Contracts\Container\Container
的对象。
答案 1 :(得分:2)
只有依赖于接口时才需要bind
个类。如果指定特定的类,则反射将为您完成工作。 documentation
唯一可行的方法是设置第二个参数的默认值。在任何其他情况下,都会抛出语法异常。
use App\Plan
class todoService
{
public function createList($request, Plan $plan = null)
{
//
}
}
public function create(CreateRequest $request)
{
return $this->todoService->createList($request);
}
它会起作用,但这会有意义吗?
答案 2 :(得分:1)
Laravel在这个级别上不能做任何魔术,因为你的编码错误只是一个PHP语法错误。您指示第二个参数的类型为Plan
,这使其成为必需的隐式参数。 Laravel不能像这样“修补”简单的函数调用。
您的困惑可能在于,根据您的路由,Laravel可以将正确的Plan
参数注入create
控制器方法,从而允许您将其转发到服务中。
答案 3 :(得分:0)
/**
* 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