Symfony одно действие для разных сущностей

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

Метод проверяет, разрешено ли вам загружать и успешно ли получать ответы с запрошенным файлом.

/**
* @Route("/group/{slug}/profile/filestorage/{groupFile}/download", name="group_profile_filestorage_file_download")
* @ParamConverter("groupFile", class="AppBundle:GroupFile", options={"mapping": {"groupFile": "fileName"}})
*
* @Route("/event/{slug}/profile/filestorage/{eventFile}/download", name="event_profile_filestorage_file_download")
* @ParamConverter("eventFile", class="AppBundle:EventFile", options={"mapping": {"eventFile": "fileName"}})
*/
public function fileStorageFileDownloadAction(?Group $group, ?Event $event, ?GroupFile $groupFile, ?EventFile $eventFile)
{
if ($group && (!$groupFile->getGroup() || $groupFile->getGroup()->getId() != $group->getId())) {
return new NotFoundHttpException();
} elseif ($event && (!$eventFile->getEvent() || $eventFile->getEvent()->getId() != $event->getId())) {
return new NotFoundHttpException();
}

// code for downloading the file
}

Как видите, я должен использовать два разных ParamConverters чтобы получить правильную сущность.
groupFile а также eventFile наследуют от общего родительского класса file, Но у них тоже есть дополнительные методы, которые мне нужны в моих действиях, поэтому мне нужен правильный дочерний объект.

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

Итак, мой вопрос: это лучший способ, который вы можете сделать в Symfony, или, надеюсь, есть еще лучшие способы, чем этот подход?

3

Решение

Вы можете поместить свой «код для загрузки файла» в черту (или услугу).

Создайте два действия (groupFileDownloadAction и enventFileDownloadAction) и используйте свой признак (или службу) внутри действия

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector