Оптимизация — Два похожих метода

Я новичок в 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);
}

Мой второй контроллер идентичен.
Разница лишь в другом объекте и другой форме. Каков наилучший способ оптимизировать этот код. Стоит ли создавать сервисы, которые добавляют фотографии или использовать обработчик цепочек? Может быть, у вас есть идеи получше?
Спасибо за помощь

1

Решение

Короткий ответ: не тратьте время на попытки оптимизировать подобные вещи.

Ваш метод состоит из 19 строк кода. Это все основные котлы легко читаемый код. Я знаю, всякий раз, когда я вижу дублирующий код, я испытываю желание попытаться как-то его объединить, но что именно получится? Сокращение 19 строк до 15?

Если бы я собирался изменить ваш код, то я бы соблазнился перенести часть бизнес-логики в собственный сервис. Что-то вроде:

InstructorManager::addImage($instructor,$image);

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

Конечно, вам может понадобиться добавить функциональность в будущем. Может быть, вы хотите уведомить кого-то, когда изображение меняется. Если вам нужно модифицировать дублированный код, вы, вероятно, можете оправдать усилия по переносу общего кода в его собственную службу.

И я полагаю, что вы могли бы создать сервис для своей формы, используя фабричные возможности контейнера. Особенно, если у вас есть куча этих форм, чтобы сделать. Но, опять же, вряд ли стоит усилий и может даже усложнить обслуживание.

0

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

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

По вопросам рекламы [email protected]