Symfony 2.8 Автопроводка для метода впрыска

Почему я хочу это сделать? Контроллеры не обязательно придерживаются SRP, и я не собираюсь создавать новый класс для каждого, по сути, действия контроллера. Следовательно, контроллер не должен иметь все вводится через конструктор, но соответствующий вызываемый метод должен иметь возможность явно указывать «я требую эти объекты» и другой метод «эти другие объекты».

Начиная с Symfony 2.8, компонент Dependency Injection теперь обеспечивает автоматическое подключение ваших услуг, если вы предоставляете autowire: true в services.yml,

Я определяю свой контроллер как сервис, вот так:

test_controller:
class: AppBundle\Controller\TestController
autowire: true

Мой контроллер выглядит следующим образом:

class TestController
{
public function indexAction(TestClass1 $tc1, $id)
{
return new Response('The slug is: ' . $id);
}
}

Вы заметите, что я пишу для TestClass, который является просто пустым классом. Однако при обновлении страницы появляется следующая ошибка:

Инъекция метода Symfony Ошибка автопроводки

Что мне нужно изменить в моем services.yml файл для автоматической вставки зависимостей в мой метод контроллера? Просто примечание, вопрос не потому что у меня есть $id «Слизняк» потом. Удаление это ничего не делает.

3

Решение

Изменить: я создал пакет, позволяющий делать более или менее так, как вы хотите, называется DunglasActionBundle.

Отказ от ответственности: я являюсь автором системы электропроводки Symfony.

Компонент Symfony Dependency Injection (и система автоматической проводки является его частью) не работает таким образом. Он только позволяет автоматически внедрять зависимости в конструктор классов служб и ничего не знает о классах контроллеров, действиях и других частях компонента HttpKernel.

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

Должна быть возможность соединить систему автопроводки с параметрами контроллера, используя пользовательский конвертер параметров. Тем не менее, я предлагаю вам пойти другим путем Я впервые описал здесь:

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

Это производная от / похожая на шаблон ADR, применяемый к Symfony.

  1. Действие — это отдельный класс с __invoke() метод, содержащий все это
    логика (должно быть только несколько строк клеевого кода для вызова домена и
    ответчик).
  2. Действия регистрируются как сервис (это может быть
    автоматизирован с использованием прохода компилятора и некоторых соглашений, аналогично тому, как
    мы обнаруживаем контроллеры прямо сейчас, с возможностью переопределить
    определение при необходимости)
  3. На таких сервисах действий автоматическое подключение включено.

Это означает, что почти так же легко, как нынешние контроллеры использовать для
разработчик, но с явным графом зависимостей и лучше
повторное использование. Только вещи, которые действительно необходимы, вводятся. В
На самом деле, такую ​​систему уже можно использовать с Symfony. Мы делаем это в
Мастер Платформы API. Вот одно действие, например:
https://github.com/dunglas/DunglasApiBundle/blob/master/Action/PostCollectionAction.php

В этой реализации я также полагаюсь на события ядра, чтобы иметь возможность
подключить и играть какую-то логику (постоянство, проверка …) в
отделен, но это выходит за рамки.

3

Другие решения

Других решений пока нет …