Я новичок в Symfony и у меня есть небольшая проблема.
Я искал в Интернете, не мог найти ответ на свою проблему.
Я создаю API, и у меня есть два контроллера (UserController, InstructorController) с похожим методом (addUserImage, addInstructorImage). Я создал абстрактный BaseImage (здесь сохраняются файлы), InstructorImage и UserImage (здесь задаются пути). Это мой контроллер:
/**
* @ApiDoc(
* name="addInstructorImage", section="Instructors",
* description="Add Instructor Image",
* )
*
* @Route("/instructor/{instructor}/image", name="instructors.image.add")
* @Method("POST")
*
* @param Request $request
* @param Instructor $instructor
* @View
*
* @return \FOS\RestBundle\View\View
*/
public function addInstructorImage(Request $request, Instructor $instructor)
{
$this->denyAccessUnlessGranted('edit', $instructor->getUser());
$image = new InstructorImage();
$form = $this->get('form.factory')
->createNamed('', InstructorImageType::class, $image, ['csrf_protection' => false, 'method' => 'POST']);
$form->handleRequest($request);
if ($form->isValid()) {
$image->setInstructor($instructor);
$em = $this->getDoctrine()->getManager();
$em->persist($image);
$em->flush();
return $this->view(null, Response::HTTP_NO_CONTENT);
}
return $this->view($form, Response::HTTP_BAD_REQUEST);
}
Мой второй контроллер идентичен.
Разница лишь в другом объекте и другой форме. Каков наилучший способ оптимизировать этот код. Стоит ли создавать сервисы, которые добавляют фотографии или использовать обработчик цепочек? Может быть, у вас есть идеи получше?
Спасибо за помощь
Короткий ответ: не тратьте время на попытки оптимизировать подобные вещи.
Ваш метод состоит из 19 строк кода. Это все основные котлы легко читаемый код. Я знаю, всякий раз, когда я вижу дублирующий код, я испытываю желание попытаться как-то его объединить, но что именно получится? Сокращение 19 строк до 15?
Если бы я собирался изменить ваш код, то я бы соблазнился перенести часть бизнес-логики в собственный сервис. Что-то вроде:
InstructorManager::addImage($instructor,$image);
Это позволило бы избавиться от котельной пластины менеджера сущностей и обеспечить немного абстракции. Это может немного облегчить тестирование, хотя все, что делает метод, это устанавливает изображение и вызывает сброс. Вряд ли стоит усилий. Возможно, это того стоит, если у вас есть и другие функциональные возможности типа менеджера. Или, может быть, вы хотите иметь возможность добавлять изображения из консольного приложения.
Конечно, вам может понадобиться добавить функциональность в будущем. Может быть, вы хотите уведомить кого-то, когда изображение меняется. Если вам нужно модифицировать дублированный код, вы, вероятно, можете оправдать усилия по переносу общего кода в его собственную службу.
И я полагаю, что вы могли бы создать сервис для своей формы, используя фабричные возможности контейнера. Особенно, если у вас есть куча этих форм, чтобы сделать. Но, опять же, вряд ли стоит усилий и может даже усложнить обслуживание.
Других решений пока нет …