Laravel - 如何在验证规则构造中自动注入?

时间:2018-03-11 16:49:04

标签: laravel laravel-5

我无法通过Laravel注入这些变量:

//...class AllowedUsername implements Rule...

public function __construct(Router $router, Filesystem $files, Repository $config)
{
    $this->router = $router;
    $this->files = $files;
    $this->config = $config;
}

我收到错误:

 Type error: Too few arguments to function ... 0 passed in.

为什么Laravel不会自动执行此操作?

$request->validate([
            'username' => ['required', new AllowedUsername],           
        ]);

1 个答案:

答案 0 :(得分:1)

为了充分利用Laravel的注射魔法,你需要使用Laravel的API,它本质上是:

  • resolve($class),它是app($class)
  • 的包装
  • app($class, $params = [])包装:
  

注意:我已为$abstract更改$class

if (is_null($class)) {
    return Container::getInstance();
}

return Container::getInstance()->make($class, $parameters);

要从容器中解析的类(如代码示例中所示):

public function __construct(Router $router, Filesystem $files, Repository $config)
只有因为Laravel维护者已经为Router::classFilesystem:class(例如:FilesystemServiceProvider)定义了绑定,才能解析

Repository::class似乎是简单的类,在“newing up”时不需要参数(或需要容器已经知道如何解析的参数) - 因此Laravel可以毫无问题地解决它

  

如果类不依赖于任何接口,则无需将类绑定到容器中。不需要指示容器如何构建这些对象,因为它可以使用反射自动解析这些对象。

这就是为什么resolve(AllowedUser::class)resolve(Router::class) ......工作。

为了让Laravel知道在“newing up”期间应该发送什么构造函数的参数,你可以使用documentation中提到的绑定。