Laravel自动注射仅用于控制器功能吗?

问题描述 投票:0回答:2

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

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

这里Request是自动传递的,但是如果我把这个store()函数称为同一个控制器的其他函数,它说我需要传递1个参数。它不会自动注入Request,为什么会这样? Laravel仅为路由器上的功能自动注入变量?怎么样?

php laravel dependency-injection
2个回答
0
投票

您可以在调用控制器方法时“手动”尝试从服务容器中解析:

$this->store(app('Request'));

但似乎你可能想要一个不同于此的模式。


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

© www.soinside.com 2019 - 2024. All rights reserved.