Это интересный вопрос - как вы упомянули, он может быть немного субъективным, но заслуживающим обсуждения.
Вы касаетесь нескольких моментов, поэтому я попытаюсь рассмотреть их отдельно.
Вложение против не вложения
Первое, что нужно прояснить, на мой взгляд, это маршруты браузера по сравнению с маршрутами API. Если вы предоставляете API - либо для своего приложения, либо для публики, я бы избегал вложенных маршрутов по нескольким причинам:
- Формат ресурса / идентификатора довольно стандартен и выразителен для API
- это облегчает документирование
- это упрощает динамическое построение запросов API для приложения пользователя
Однако, ваш вопрос, похоже, сосредоточен на маршрутах браузера. По моему мнению, браузерные маршруты могут и должны быть такими, какие читаются - URL, особенно в наши дни, может рассматриваться как часть пользовательского интерфейса. Например, вы можете перейти к настройкам (и я ожидаю увидеть /settings
), со страницы настроек, если бы я пошел в раздел настроек уведомлений, я бы ожидал увидеть /settings/notifications
,
Маршруты действуют и помогают с UX - они почти крошка и должны выглядеть именно так.
Итак, я бы определенно вкладывал в маршруты браузера, а определенно не в API.
целостность маршрута
Реальная суть вашего вопроса, я думаю, касается целостности маршрута. Я думаю, что независимо от того, решите вы вкладывать или нет, вам нужно проверять свои разрешения, исходя из предположения, что кто-то вмешивается в URL-адреса - так же, как вы предполагаете, что пользователь вмешался в ввод формы.
По сути, ваши маршруты (вложенные или нет) действуют как входные данные, и вам нужно будет это проверить. Промежуточное программное обеспечение на уровне маршрутов является одним из подходов, но часто оно слишком универсальное, чтобы решать какие-либо сложные задачи, поэтому вам может быть проще справиться с ним с помощью промежуточного программного обеспечения контроллера (https://laravel.com/docs/5.7/controllers#controller-middleware).
Так что вы можете сделать что-то вроде:
public function __construct()
{
$this->middleware('auth');
$this->middleware('canViewProject')->only('show');
$this->middleware('canEditProject')->except('store');
}
Используете ли вы Gates, Policies или просто старое промежуточное ПО, вероятно, будет зависеть от сложности проекта - но вышеизложенное применимо независимо от того - обрабатывать URL-адреса как входные данные и проверять соответственно