Как правильно внеднять зависимости в контроллер symfony3?

На примере laravel5 я биндил реализацию на интерфейс и просто в методе или конструкторе запрашивал нужный мне интерфейс и framework сам подставлял мне нужный инстанс класса.

Тут мне приходится описывать все в yml конфиге и вызывать зависимость через $this->get('app.product.create.handler') или примерно так-же как в laravel5 получать по типу объекта.

Но я столкнулся с некой проблемой в контроллерах. Тоесть в экшине $this->get('app.product.create.handler')
работает, а вот в конструкторе выдает ошибку Error: Call to a member function get() on null

Хотя во всех остальных ситуациях все работает, похоже такое поведение распространяется только на конструкторы контроллеров, почему так происходит ?
  • Вопрос задан
  • 537 просмотров
Пригласить эксперта
Ответы на вопрос 3
@shaqster
Symfony3 Guru
Достаточно посмотреть реализацию класса Controller и все станет очевидно. Ссылка на экземпляр контейнера попадает в контроллер через метод setContainer, которым пользуется DI. Поэтому вы вполне оправданно получаете ошибку.

Отвечая на ваш вопрос: не внедряйте зависимости в контроллер. Дергайте их в action по мере необходимости, а лучше - выкидывайте всю бизнес логику в менеджеры, репозитории, провайдеры, билдеры, etc и используйте action только для рендеринга ответа.
Ответ написан
@1alexandr
// ...Controller/ProductController.php
class ProductController extends Controller
{
  private $service;

  public function __construct(ServiceInterface $serviceInterface)
  {
    $this->service = $sserviceInterface;
  }
}


// Bundle/.../Service.php

class Service extends ServiceInterface
{
  ...
}


// src/.../Resources/config/service.yml
services:

  ...
  
  controller.product:
    class: Bundle/Controller/ProdcutController
    arguments: ["@service"]

  bundle.service:
    class: Bundle/Service
    arguments: ["@other_service", "@another_service"]

  bundle.another_service:
    class: AnotherService
    argum....
  ...


ИМХО обращение к сервисам через $this->get('bundle.service') не очень хороший вариант...
или используйте то что предложил shaqster
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы