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






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