Laravel внедрение зависимостей без использования контроллера - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь понять, как ввести зависимость в класс в Laravel.

Моя структура:

SimpleController extends BaseController
{
    public function example(SimpleModel $model, SimpleValidationRequest $request)
    {
        $result = $model->doStuff()
        return $this->makeResponse($result);
    }
}

SimpleModel extends Model
{
    public function doStuff(ComplexService $service)
    {
        $service->doComplexLogic($this);
    }
}

Я зарегистрировал ComplexService в своем собственный поставщик услуг:

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(ComplexService::class);
    }
}

Я хочу внедрить услугу прямо в метод doStuff simpleModel, без необходимости вводить ее в контроллер, а затем в модель. Мы заняты перемещением монолитного приложения c в Laravel и имеем классы обслуживания, содержащие все сложные бизнес-логики c. Большая часть logi c разделяется между разными классами, поэтому метод контроллера может вызывать модель, которая вызывает службу, которая в конечном итоге выполняет 4 или 5 вызовов других служб, и я хочу иметь возможность внедрить другую службу в любой метод. которому он нужен, без необходимости отправлять его с контроллера полностью на нижний метод, который может в нем нуждаться.

Есть способ сделать это? Я искал в Интернете, но все, что я нашел, потребовало от меня внедрения службы в контроллер, а затем отправки ее через приложение оттуда, чего я хочу избежать.

1 Ответ

0 голосов
/ 29 мая 2020

Вы можете просто вызвать синглтон внутри метода с помощью app() помощника

SimpleModel extends Model
{
    public function doStuff(ComplexService $service)
    {
        app()->singleton(ComplexService::class)->doComplexLogic($this);
    }
}

или восстановить синглтон, внедрив его в модель с помощью его метода __construct().

...