Laravel是否仅自动注入控制器功能?

时间:2018-12-12 17:33:28

标签: php laravel dependency-injection

这是一个问题,当我通过路由器使用请求调用控制器功能时,Laravel会自动注入。例如:

public function store(Request $request){
    // do staff
} 

这里Request是自动传递的,但是如果我从同一控制器的另一个函数调用此store()函数,则表示我需要传递1个参数。它不会自动注入Request,所以为什么呢? Laravel仅为路由器上的功能自动注入变量吗?怎么样?

2 个答案:

答案 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