Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php [Laravel]:如何将依赖项注入到由其他类(作业)扩展的抽象类中_Php_Laravel_Dependency Injection_Abstract_Solid Principles - Fatal编程技术网

Php [Laravel]:如何将依赖项注入到由其他类(作业)扩展的抽象类中

Php [Laravel]:如何将依赖项注入到由其他类(作业)扩展的抽象类中,php,laravel,dependency-injection,abstract,solid-principles,Php,Laravel,Dependency Injection,Abstract,Solid Principles,我有一个Laravel项目,在那里我创建了一个抽象类,我的几个工作将使用它,因为它们都需要使用相同的方法来查找一些数据 在Laravel中,作业的工作方式是构造函数接受您触发作业的任何值,并且在处理程序方法中,可以注入依赖项,如下所示: class SomeJob extends Job implements ShouldQueue { public function __construct(array $someData, int $someMoreData) {

我有一个Laravel项目,在那里我创建了一个抽象类,我的几个工作将使用它,因为它们都需要使用相同的方法来查找一些数据

在Laravel中,作业的工作方式是构造函数接受您触发作业的任何值,并且在处理程序方法中,可以注入依赖项,如下所示:

class SomeJob extends Job implements ShouldQueue
{
    public function __construct(array $someData, int $someMoreData)
    {
        $this->someData     = $someData;
        $this->someMoreData = $someMoreData;
    }

    public function handle()
    {
        // Do something...
    }
}


\Queue::pushOn(Queue::getDefaultQueue(), new SomeJob([1, 2, 3], 4));
这意味着我不能仅仅将依赖项从扩展类的构造函数传递到抽象类中。我可以看到,唯一的解决方法是在抽象类上有一个属性,然后在扩展类的处理程序方法中设置它

abstract class SomeAbstractClass extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    protected $configOne;
    protected $configTwo;
    protected $userRepository;

    public function __construct()
    {
        $this->configOne = config('someConfig.valueOne');
        $this->configTwo = config('someConfig.valueTwo');
    }

    public function doSomethingWithUserRepository()
    {
        return $this->userRepository->doSomething();
    }
}

class SomeClass extends SomeAbstractClass
{
    public function __construct(array $someData, int $someMoreData)
    {
        parent::__construct();

        $this->someData     = $someData;
        $this->someMoreData = $someMoreData;
    }

    public function handle(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }
}

这项工作正如预期的那样,但似乎不是正确的方法。即使它能工作,也似乎有点粗糙。有没有办法绕过这个问题?这必须是一个非常常见的问题,也不在Larvel之外。

因为定义的构造函数用于在Larvel中传递作业中的数据,因此在这种情况下,您必须将
handle()
作为“构造函数”方法

请考虑这个例子:

<?php
abstract class SomeAbstractClass extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    protected $configOne;
    protected $configTwo;
    protected $userRepository;

    public function __construct()
    {
        $this->configOne = config('someConfig.valueOne');
        $this->configTwo = config('someConfig.valueTwo');
    }

    public function handle(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    protected function doSomethingWithUserRepository()
    {
        return $this->userRepository->doSomething();
    }
}

class SomeClass extends SomeAbstractClass
{
    public function __construct(array $someData, int $someMoreData)
    {
        parent::__construct();
        $this->someData     = $someData;
        $this->someMoreData = $someMoreData;
    }

    public function handle(UserRepository $userRepository)
    {
        parent::handle($userRepository);

        // you can do whatever you liiike
        $this->doSomethingWithUserRepository();
    }
}

如果您的队列被设置为使用Laravel,您可能会通过构造函数传递依赖项和参数(根据上的文档),但我没有尝试过这一点。或者,您是否熟悉helper方法?您可以从抽象构造函数调用此函数来设置依赖项。谢谢您的评论。我不知道解析方法,但由于我在5.2上,所以无法使用它。但也许我可以做一些类似的事情。我会调查的。非常感谢。这个问题仍有待有保留的答案。