我无法通过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],
]);
答案 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::class
,Filesystem:class
(例如:FilesystemServiceProvider)定义了绑定,才能解析。
Repository::class
似乎是简单的类,在“newing up”时不需要参数(或需要容器已经知道如何解析的参数) - 因此Laravel可以毫无问题地解决它
如果类不依赖于任何接口,则无需将类绑定到容器中。不需要指示容器如何构建这些对象,因为它可以使用反射自动解析这些对象。
这就是为什么resolve(AllowedUser::class)
或resolve(Router::class)
......工作。
为了让Laravel知道在“newing up”期间应该发送什么构造函数的参数,你可以使用documentation中提到的绑定。