Symfony одно действие для разных сущностей - PullRequest
0 голосов
/ 08 ноября 2018

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

1 Ответ

0 голосов
/ 08 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...