Внедрение вложенных зависимостей Laravel - достигнут максимальный уровень вложенности функций «256» - PullRequest
0 голосов
/ 04 октября 2018

Вот пример:

Сегодня я подошел к одному условию, когда мне требовалось вызвать какую-то функцию из ServiceA в ServiceB, но опять-таки то же самое требовалось и наоборот.Что-то не так с Laravel или я делаю плохую практику с Inpendency Injection?

Я добавил пример, который чем-то похож на мою реальную базу кода.Пожалуйста, ответьте, если что-то пропущено.

Спасибо!

Контроллер:

class ExampleController extends Controller
{

    private $serviceA;
    private $serviceB;

    public function __construct(
        ServiceA $serviceA,
        ServiceB $serviceB
    )
    {
        $this->serviceA = $serviceA;
        $this->serviceB = $serviceB;
    }
}

Сервис A:

class ServiceA
{

    private $serviceB;

    public function __construct(ServiceB $serviceB)
    {
        $this->serviceB = $serviceB;
    }
}

ServiceB:

class ServiceB
{
    private $serviceA;

    public function __construct(ServiceA $serviceA)
    {
        $this->serviceA = $serviceA;
    }
}

1 Ответ

0 голосов
/ 04 октября 2018

Когда контейнер Laravel используется для создания новых экземпляров объекта, он проверяет зависимости этих объектов и либо внедряет связанные экземпляры из контейнера, либо сообщает о новых экземплярах, если это возможно.

В этом случаекогда Laravel попытается создать новый экземпляр вашего контроллера, он увидит, что ему нужен ServiceA.Если ServiceA не связан в контейнере, он попытается создать новый экземпляр.Таким образом, он проверит зависимости ServiceA и увидит, что ему нужен ServiceB.Если ServiceB не связан в контейнере, он попытается создать новый экземпляр.Таким образом, он проверит зависимости ServiceB и увидит, что ему нужен ServiceA.Если ServiceA не связан в контейнере, он попытается создать новый экземпляр.Таким образом, он проверит зависимости ServiceA и увидит, что ему нужен ServiceB.Если ServiceB не связан в контейнере, он попытается создать новый экземпляр.Таким образом, он проверит зависимости ServiceB и увидит, что ему нужен ServiceA.Если ServiceA не связан в контейнере, он будет пытаться создать новый экземпляр ... вы получите точку.

Обычно, когда у вас есть два класса, которые являются зависимостями друг от друга, это означает, что есть функциональностьв каждом, что, вероятно, принадлежит к третьему (или четвертому ...) классу.Если можете, попытайтесь идентифицировать эту функцию и разделить ее на ServiceC, от которого зависят друг от друга ServiceA и ServiceB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...