Стоит ли в 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 пространства имен моделей никак не отражать? Как вы с этим справляетесь?
Не знаю если честно.
Но как мне кажется, не стоит связывать.
Да и зачем у вас категории в адресе на материал?
Вы ведь 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