这是一个问题,当我通过路由器使用请求调用控制器功能时,Laravel会自动注入。例如:
public function store(Request $request){
// do staff
}
这里Request
是自动传递的,但是如果我把这个store()
函数称为同一个控制器的其他函数,它说我需要传递1个参数。它不会自动注入Request
,为什么会这样? Laravel仅为路由器上的功能自动注入变量?怎么样?
您可以在调用控制器方法时“手动”尝试从服务容器中解析:
$this->store(app('Request'));
但似乎你可能想要一个不同于此的模式。
Laravel的自动依赖注入仅在从IOC容器实例化对象时才有效。当路由解析为Controller操作时,Laravel将通过容器执行此操作。因此,如果Controller方法中存在任何依赖项,则会自动解析它们。但是如果直接调用$object->method()
这样的方法,则不会自动解析依赖关系。
所以在你的情况下,你不能做$this->store()
。但你可以这样做 - >
$container = \Illuminate\Container\Container::getInstance();
$container->call([$this, 'store'], []); //$container->call([$object, 'method'], [args]);
其他自定义类也是如此。如果通过Laravel的容器解析这些类,则会自动解析它们的构造函数依赖项。
例如:
class MyClass
{
private $dependency;
public function __construct(AnotherClass $dependency)
{
$this->dependency = $dependency;
}
}
然后你可以像这样通过容器获取MyClass
对象的实例 - >
$instance = $container->make(MyClass::class);
容器将自动实例化AnotherClass
。这相当于:
$instance = new MyClass(new AnotherClass());
如果AnotherClass
具有依赖项,则容器将递归地实例化它们。
示例来自:source