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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
89
1

Ответы 1

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

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

Другие вопросы по теме