在 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');
  }
}