iv4art
@iv4art
Веб-разработчик

Стоит ли в Laravel увязывать пространства имен моделей с пространствами имен роутов при разработке API?

При разработке приложения я складываю модели в App/Models. В большом проекте моделей обычно несколько десятков. Чтобы с ними было удобнее работать, а также, чтобы модели с общими названиями классов не пересекались, я раскладываю модели по пространствам имен.

Например: у меня есть статьи App/Models/Articles/Article и товары App/Models/Catalogue/Good. И статьи, и товары могут распределяться по категориями многие-ко-многим: App/Models/Articles/Category и App/Models/Catalogue/Category. Пока я работаю с классами: моделями, контроллерами, композерами представлений и т. п. — все замечательно, мне нравится. Связанные модели сгруппированы, модели с общими именам классов друг другу не мешают.

Но как только дело доходит до маршрутизации — у меня начинаются проблемы с именованием. Сейчас начал осваивать разработку Web-API и роуты получаются типа /api/v1/articles/categories/1/articles, так как я пытаюсь в маршруте отразить пространства имен моделей-ресурсов. Мне не нравится то, что в пути два раза articles, а еще роут /api/v1/articles отдает 404, хотя будучи вырванным из контекста он намекает на коллекцию статей.

Структурно маршрутизация и модели у меня связаны пространством имен: мне кажется, что это логично и прозрачно для разработчика API, что хорошо. Если я захочу привести маршрут со статьями в категории к виду /api/v1/articles-categories/1/articles, то вроде от путаницы в роутах я избавлюсь, но тогда логично и модели называть App/Models/ArticleCategory, но тогда я лишусь преимуществ пространства имен, так как связанные модели будут разгруппированы.

Или не стоит запариваться с этими соответствиями и по-прежнему держать модели в удобных пространствах имен, а в маршрутах для API пространства имен моделей никак не отражать? Как вы с этим справляетесь?
  • Вопрос задан
  • 255 просмотров
Решения вопроса 1
YaRobot
@YaRobot
Senior PHP microservices 500px.com
Не знаю если честно.
Но как мне кажется, не стоит связывать.
Да и зачем у вас категории в адресе на материал?
Вы ведь API делаете. Пускайте в фильтре или заголовком.

Допустим GET /api/v1/articles?fq['category']=1 (ну или в заголовке)
Получаем все статьи из категории. Если без фильтра, то получаем вообще все статьи.
Можно конечно и переработать структуру.
Маршруты делайте как удобно, а модели и иже с ними, логично располагать.

Мне все равно какой роут у нас в проекте. Если мне надо что то поменять, я и так знаю где искать.
К примеру мне надо изменить модель статей (с переводом в лару).
Domain/Model/Article/ArticleModel.php (это если домен делать, ну или оставить App )

UPD:
У нас принято в конце каждого файла, давать название, что он делает.
App/Request/Article/ArticleRequest.php
App/Model/Article/ArticleModel.php
App/Model/Article/ArticleCategoryModel.php
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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