Где можно посмотреть толковые реализации API на Symfony?

Здравствуйте!
Пару месяцев на новом проекте, архитектура которого меня стала раздражать. Конечно, многие косяки я пофиксил, но всё равно этот код мне не дает покоя.

Что напрягает:

1. Сервисы, которые делают все. Например, получает request, делает валидацию, проверку доступа и дальше идет бизнес-логика. По мне, валидация и проверка доступа (на update entity, etc) должна быть в контроллере, и далее логика должна прокидываться в сервисы. Остальные сервисы дробить на более мелкие.

2. HTTP-эксепшены в сервисах. В будущем, возможно, придется вызывать эти сервисы в CLI, поэтому такие эксепшены не имеют смысла. Как вы обычно разруливаете в таких случаях. Бросаете стандартные php исключения, далее ловите их в контроллерах и уже бросаете HTTP-исключения?

3. JMS-сериалайзер. Из-за этих групп сериализации легко сломать клиентские приложения. Благо есть behat-тесты, но часто их гонять - потеря времени. Думаю создать отдельные нормалайзеры для каждой сущности. Всё будет в одном месте: можно инджектить сервисы (роутер, например, для генерации url), но есть проблема с генерацией API DOC.

4. NelmioApiDocBundle - очень крутой бандл, но завязан на группах сериализации. Бесят километровые комментарии перед экшенами, т.к при мерж-конфликтах легко допустить ошибку. Есть ли какая-то альтернатива?

5. Валидация. С простыми данными легко обходиться валидатором и DTO, но в более сложных случаях всё еще юзаю формы. Простой пример - sync many-to-many отношений. Также эвенты формы часто выручают.
  • Вопрос задан
  • 434 просмотра
Решения вопроса 2
@EvgeniiR
https://github.com/EvgeniiR
1. Валидация не в контроллере, а в аргумент резолверах валидируются DTO(через аннотации и Symfony validator), которые после поступают в контроллер.
Бизнес логика - в сущностях а не в сервисах.
2. "Http-эксепшн" - не бывает таких. Бывают просто эксепшены, и просто эксепшены которые горе-программист использует как goto для того чтобы вылезти из стека вызовов и сконвертировать ошибку. Не нужно так делать. Логика кидает исключение, контроллер формирует респонс.
3. JMS-serializer не нужен и заменяется symfony-serializer. Сущности не сериализуются в ответ для пользователя, для этого существуют DTO.
Ответ написан
OnYourLips
@OnYourLips
3. Выбросить, он делает то, что делать не нужно. А то, что нужно, делается штатными средствами symfony. Используйте DTO и ассемблеры, версионируйте их. Имейте живые версии параллельно.

4. Используйте OpenAPI, это развитие вашего подхода. Не пишите документацию внутри кода.
Этот бандл в помойку вслед за предыдущим.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы