Laravel - 类型错误:参数太少?

时间:2017-05-13 22:36:26

标签: php laravel laravel-5 laravel-5.4

我收到错误:

  

类型错误:参数太少

如果争论没有完全通过,我认为Laravel会有一些魔力吗?

例如:

在控制器中我有:

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

todoService课程中:

use App\Plan

class todoService {   

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

如您所见,我没有传递Plan类对象。我必须绑定什么吗?

4 个答案:

答案 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] );

此处$containerIlluminate\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)

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