在 Laravel 中递归注入服务
Inject services recursively in Laravel
我正在使用 Laravel 5.2.45。
我正在为我的服务使用依赖注入。
现在,有 service A
需要 service B
,所以我将 service B
注入 A
。
另外,service B
里面有方法需要service A
,所以我也把service A
注入了B
。
但是,此配置似乎会产生问题。这是我的实现:
class AService
{
/**
* @var BService
*/
protected $bService;
public function __construct(BService $bService) {
$this->bService = $bService;
}
}
class BService
{
/**
* @var AService
*/
protected $aService;
public function __construct(AService $aService) {
$this->aService = $aService;
}
}
首先我注意到我的路线不工作,所以我尝试检查它们:
php artisan route:list
我得到了:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 4096 bytes) in
/var/www/tacnet-plus/bootstrap/cache/compiled.php on line 1426
Segmentation fault (core dumped)
看来这个配置会造成内存溢出。我怀疑第一个服务会创建第二个服务,而第二个服务会无限期地创建第一个服务。
我过去在 Java Spring 遇到过同样的问题,我知道你可以用 setter 而不是构造函数来注入你的服务,以避免在构造函数中创建依赖关系并通过 setter 按需注入服务。 Laravel有类似的东西吗?
似乎没有开箱即用的东西可以在不使用构造函数的情况下注入服务。但是,我可以更改这两个服务之一以在 getter 中手动注入另一个服务,而不是构造函数:
class AService
{
/**
* @var BService
*/
protected $bService;
public function __construct(BService $bService) {
$this->bService = $bService;
}
}
use App;
class BService
{
public function __construct() {
}
/**
* @return AService
*/
private function getAService() {
return App::make('Some\Namespace\AService');
}
}
我正在使用 Laravel 5.2.45。
我正在为我的服务使用依赖注入。
现在,有 service A
需要 service B
,所以我将 service B
注入 A
。
另外,service B
里面有方法需要service A
,所以我也把service A
注入了B
。
但是,此配置似乎会产生问题。这是我的实现:
class AService
{
/**
* @var BService
*/
protected $bService;
public function __construct(BService $bService) {
$this->bService = $bService;
}
}
class BService
{
/**
* @var AService
*/
protected $aService;
public function __construct(AService $aService) {
$this->aService = $aService;
}
}
首先我注意到我的路线不工作,所以我尝试检查它们:
php artisan route:list
我得到了:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in /var/www/tacnet-plus/bootstrap/cache/compiled.php on line 1426 Segmentation fault (core dumped)
看来这个配置会造成内存溢出。我怀疑第一个服务会创建第二个服务,而第二个服务会无限期地创建第一个服务。 我过去在 Java Spring 遇到过同样的问题,我知道你可以用 setter 而不是构造函数来注入你的服务,以避免在构造函数中创建依赖关系并通过 setter 按需注入服务。 Laravel有类似的东西吗?
似乎没有开箱即用的东西可以在不使用构造函数的情况下注入服务。但是,我可以更改这两个服务之一以在 getter 中手动注入另一个服务,而不是构造函数:
class AService
{
/**
* @var BService
*/
protected $bService;
public function __construct(BService $bService) {
$this->bService = $bService;
}
}
use App;
class BService
{
public function __construct() {
}
/**
* @return AService
*/
private function getAService() {
return App::make('Some\Namespace\AService');
}
}