Задать вопрос

Laravel5: Как внедрять зависимость в которой конструктор со своими параметрами?

Работая со слоеной архитектурой, используя DI и тп. я столкнулся со следующей проблемой:

К примеру есть такой код контроллера, в котором есть index экшен, который инжектит в себя MyService.
Для простоты и сокращения интерфейсы не рассматриваем.

<?php

namespace App\Http\Controllers;

use App\Http\Requests\TestRequest;
use App\Services\MyService;

class TestController extends Controller
{
    protected $myService;
    
    public function index(TestRequest $request, MyService $myService)
    {
        echo $request->get('var1');
    }

}


Как мы знаем, laravel5 сам автоматически инжектит запрашиваемые классы из DIC. Все бы хорошо и здорово, но что если код сервиса выглядит следующим образом:

<?php

namespace App\Services;

class MyService
{
    private $data = true;

    public function __construct($data)
    {
        $this->data = (bool)$data;
    }

    public function getData()
    {
        return $this->data;
    }
}


Тоесть там не нужны сеттеры и в конструкторе ожидается явным образом аргумент. Соответственно при таком раскладе мы увидим ошибку примерно такого содержания:

BindingResolutionException in Container.php line 849: Unresolvable dependency resolving [Parameter #0 [ <required> $data ]] in class App\Services\MyService


Да мы можем забиндить через интерфейс дефолтные данные и все такое, но что если данные которые нам нужны в конструкторе MyService, это именно те данные, которые я ожидаю получить из контроллера, тоесть $request->get('var1');

Исходя из этого подскажите пожалуйста как решается подобная проблема ?

Я смотрю в сторону фабрик, однако хочется получить рекомендацию и пример использования, за ранее спасибо.
  • Вопрос задан
  • 796 просмотров
Подписаться 6 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Nimfus
Переменная $data должна иметь определение класса или интерфейса, в противном случае Ларавел даже не подозревает что подставить в $data.
<?php

namespace App\Services;

use SomeInterface;

class MyService
{
    private $data = true;

    public function __construct(SomeInterface $data)
    {
        $this->data = (bool)$data;
    }

    public function getData()
    {
        return $this->data;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы