У меня есть одно действие 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, или, надеюсь, есть еще лучшие способы, чем этот подход?