[Laravel]:我如何将依赖项注入由其他 classes(jobs) 扩展的抽象 class
[Laravel]: How do I dependency inject into an abstract class extended by other classes(jobs)
我有一个 Laravel 项目,我在其中创建了一个摘要 class,我的几个作业将使用它,因为它们都需要使用相同的方法来查找一些数据以继续。
在 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));
这意味着我不能只将依赖项从扩展 class' 构造函数传递到抽象 class 中。据我所知,解决它的唯一方法是在抽象 class 上有一个 属性,然后在扩展的 class.
的处理程序方法中设置它
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;
}
}
这按预期工作,但似乎不是正确的方法。即使它有效,它似乎也有点老套。有办法解决这个问题吗?这一定是一个非常普遍的问题,也在 Laravel.
之外
因为在Laravel中的jobs中使用了定义的构造函数来传递数据,所以在这种情况下,你必须将handle()
视为"constructor"方法。
考虑这个例子:
<?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 项目,我在其中创建了一个摘要 class,我的几个作业将使用它,因为它们都需要使用相同的方法来查找一些数据以继续。
在 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));
这意味着我不能只将依赖项从扩展 class' 构造函数传递到抽象 class 中。据我所知,解决它的唯一方法是在抽象 class 上有一个 属性,然后在扩展的 class.
的处理程序方法中设置它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;
}
}
这按预期工作,但似乎不是正确的方法。即使它有效,它似乎也有点老套。有办法解决这个问题吗?这一定是一个非常普遍的问题,也在 Laravel.
之外因为在Laravel中的jobs中使用了定义的构造函数来传递数据,所以在这种情况下,你必须将handle()
视为"constructor"方法。
考虑这个例子:
<?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();
}
}