这是一个问题,当我通过路由器使用请求调用控制器功能时,Laravel会自动注入。例如:
public function store(Request $request){
// do staff
}
这里Request
是自动传递的,但是如果我从同一控制器的另一个函数调用此store()
函数,则表示我需要传递1个参数。它不会自动注入Request
,所以为什么呢? Laravel仅为路由器上的功能自动注入变量吗?怎么样?
答案 0 :(得分:0)
当您调用控制器方法时,您可以尝试从服务容器中“手动”进行解析:
$this->store(app('Request'));
但是看来您可能想要一个与此不同的模式。
答案 1 :(得分:0)
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