Laravel5: Как внедрять зависимость в которой конструктор со своими параметрами? Работая со слоеной архитектурой, используя DI и тп. я столкнулся со следующей проблемой
К примеру есть такой код контроллера, в котором есть index экшен, который инжектит в себя MyService
Для простоты и сокращения интерфейсы не рассматриваем.get('var1')

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

public function getData(

return $this->data

Тоесть там не нужны сеттеры и в конструкторе ожидается явным образом аргумент. Соответственно при таком раскладе мы увидим ошибку примерно такого содержания:BindingResolutionException in Container.php line 849: Unresolvable dependency resolving [Parameter #0 [ $data ]] in class App\Services\MyServic
Да мы можем забиндить через интерфейс дефолтные данные и все такое, но что если данные которые нам нужны в конструкторе MyService, это именно те данные, которые я ожидаю получить из контроллера, тоесть $request->get('var1');Исходя из этого подскажите пожалуйста как решается подобная проблема ?
Я смотрю в сторону фабрик, однако хочется получить рекомендацию и пример использования, за ранее спасибо.

21 Авг 2019 в 07:03
203 +1
0
Ответы
1

Для решения данной проблемы, вам необходимо использовать фабрику (Factory) в Laravel. Фабрика предоставит возможность инъекции зависимостей с параметрами в конструкторе.

В вашем случае, вам нужно создать фабрику для сервиса MyService, которая будет возвращать экземпляр MyService с переданным параметром.

Ниже приведен пример создания фабрики для MyService:

namespace App\Services
use Illuminate\Contracts\Container\Container
class MyServiceFactor

protected $container
public function __construct(Container $container

$this->container = $container

public function create($data

return $this->container->make(MyService::class, ['data' => $data])

}

Далее вам нужно зарегистрировать эту фабрику в вашем сервис-провайдере. Например, в AppServiceProvider.php:

namespace App\Providers
use Illuminate\Support\ServiceProvider
class AppServiceProvider extends ServiceProvide

public function register(

$this->app->singleton('MyServiceFactory', function ($app)
return new MyServiceFactory($app)
})

}

Теперь вы можете использовать фабрику в вашем контроллере:

namespace App\Http\Controllers
use App\Http\Requests\TestRequest
use App\Services\MyServiceFactory
class TestController extends Controlle

protected $myServiceFactory
public function __construct(MyServiceFactory $myServiceFactory

$this->myServiceFactory = $myServiceFactory

public function index(TestRequest $request

$data = $request->get('var1')
$myService = $this->myServiceFactory->create($data)
echo $myService->getData()

}

Теперь при вызове метода index в контроллере, данные будут передаваться в конструктор MyService с помощью фабрики.

20 Апр в 13:08
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 700 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир