Добрый день
Подскажите, пожалуйста, правильную организацию кода в симфони.
Ситуация, условно, такая: изначально создавалась сущность Order (заказ), и несколько экшенов в OrderController для создания, поиска и редактирования заказа. Соответственно, для каждого экшена были созданы свои формы (CreateOrderForm, и т.д.) и вьюхи (create_order.html.twig и т.д.). Так же создана OrderModel, в которой реализована вся логика обработки и сохранения в базу.
Теперь предстоит при наличии у заказа определенного атрибута реализовывать логику, частично отличную от изначальной (появляюся дополнительные поля для информации о заказе + некоторые отличия в обработке).
Для форм можно создать отдельные CreateNewOrderForm и т.д., которые отнаследовать от уже существующих. Вьюхи разбить отдельные шаблоны, вынести в файлы и для разных типов заказа отрисовывать соответстсующие. Для организации логики так же есть вариант создать NewOrderModel, которую отнаследовать от существующей и переопределеить нужные методы.
Но тогда получатся, что логика экшенов контроллера одинаковая, отличается только создаваемая форма , вызываемая модель и отрисовывающаяся вьюха. Держать несколько одинаковых контроллеров - дублирование. Писать что-то типа
if ($orderType == 'new') {
$form = $this->createForm(new CreateNewOrderForm());
} else {
$form = $this->createForm(new CreateOrderForm());
}
и аналогичные блоки кода для вызова модели и отрисовки вьюх - как-то тоже попахивает нарушением принципов ООП. Тем более при появлении новых типов данный блок условий будет только разрастаться.
Какие есть более правильные варианты?