Symfony2 и быть сухим подходом в контроллерах - PullRequest
5 голосов
/ 14 марта 2012

Я разрабатываю небольшую CMS для своей компании, используя Symfony2. Я действительно люблю эту структуру. Я люблю занятия по форме и их повторное использование (в конце концов, это все о формах).

Но (да, есть "но"), я чувствую, что делаю то же самое, копирую и вставляю во все контроллеры . Дублирование кода, которое мы ненавидим. Со всей бизнес-логикой, перемещенной в Службы и формы, события, постоянные действия в Doctrine, все мои контроллеры делают то же самое:

  • Получить репозиторий $this->get('mycompany.repository.entity')
  • Динамически создать форму (логика находится внутри самого класса формы)
  • Проверка формы, возвращение представления или сохранение сущности
  • и так далее ...

Я имею в виду, что действия контроллера одинаковы , меняется всего несколько символов.

Как можно DRY с Symfony2 в моих контроллерах? Может быть, контроллер как услуга (концепция, которую я обнаружил всего несколько дней назад) может помочь?

РЕДАКТИРОВАТЬ : связанный вопрос (с первой идеей, предложенной Boo): Symfony2, как перенаправить на действие без жесткого имени маршрута?

1 Ответ

2 голосов
/ 14 марта 2012

Существует множество способов получить более сухую кодовую базу:

  1. Вы можете создать абстрактный BaseController.Он может сгруппировать код, который повторяется, в некоторый закрытый метод (ы), так что каждый расширяющий его контроллер может использовать его.Используя закрытые свойства, вы можете установить специфичные для контроллера вещи перед вызовом методов.
  2. Вы можете реализовать некоторые BaseService, поэтому вам нужно только вызвать эту службу, установить некоторые параметры (например, какой репозиторий использовать) и затем получитьслужба выполняет логику
  3. У вас может быть только один контроллер, который принимает некоторые параметры и определяет каждый маршрут для использования этого контроллера, передавая определенные параметры.

Я думаю, есть еще больше способовдумая об этом.

Я нахожу идею 1 очень элегантной, в то время как 3 также имеет некоторые преимущества.Второй подход - это нечеткость, особенно если вам снова нужен дублированный код (даже если он будет намного меньше, он далеко не оптимален).Идея 1 совпадает с идеей ОО и хорошо передает ее намерения.Подводя итог, я бы использовал BaseController!

...