Комментарии 29
У меня в одном веб-роуте как админка, так и веб. Почти 50-60 строк. Это очень неудобно.
ЗЫ. Если проект прям совсем с разнородными бизнес процессами можно разделять на модуля. Аля nwidart/laravel-modules.
Простите, не совсем понял.
Вы оставили те же файлы, которые есть по умолчанию. Добавили admin.php (который, в случае с подключаемыми админками тоже сам создается) и user.php (а что именно в нем должно быть? Route::auth()?)
Как решение убрать api и web в свои поддериктории помогло избавиться от 200 строк маршрутов?
Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
Рабочий (в моем случае) кейс с дополнительным файлом роутов — это локальные роуты для разработки, например
if (app()->isLocal() && !app()->runningInConsole()) {
$this->mapLocalRoutes();
}
и в файле с роутами local.php спокойно пишем всякий треш для разработки (роуты доступены по /local/*)
Route::get('/login', function () {
tap(User::find(1), function ($user) {
$user->email_verified_at = now();
$user->save();
auth()->login($user);
});
return redirect('/');
});
Очень удобно на самом деле, особенно когда нужно переиспользовать :)
Первый — простой и топорный:
foreach ($this->file('images') as $image) {
$this->validateImage($image);
}
В validateImage — чуть что, return abort(422).
Второй способ чуть-чуть посложнее, но более правильный, опять таки переиспользовать очень легко — laravel.com/docs/5.8/validation#custom-validation-rules
P.S. У Laravel есть еще фильтры уже на картинки, т.е. можно просто сказать request images должен быть image, но не уверен что это, что вам нужно.
Смотря какая валидация. Если типа той, что можно проверить через Swagger/JsonSchema/… то или в контроллере, или ещё до него (кастомные реквесты и аналоги)
Решение правильное, но для ЧПУ неймспейсы из RouteServiceProvider убираем и используем полный путь в самих роутах:
Route::get('/test', [TestController::class, 'index']);
Так и роуты читаемые и легко в иде перейти в нужный контроллер.
github.com/LaravelCollective/annotations
А список можно получить `php artisan route:list` и вычитывайте, сколько хотите :)
Комментарии — для людей (+IDE в которой тоже работают люди).
Код — для интерпретатора.
Если вам нравится помечать роут из контроллера (оставим целесообразность за скобками) — придумайте что-нибудь типа $this->markThisRouteAs('IndexPage');
Это занимает ту же самую одну строчку, но теперь это абсолютно валидный php код, который не основан на магии, легко отслеживается и позволяет отладку.
Если вам нравится помечать роут из контроллера (оставим целесообразность за скобками) — придумайте что-нибудь типа $this->markThisRouteAs('IndexPage');
И когда оно выполнится? Когда кто-то дернёт урл индекса? :)
А так, придумать вариант вполне можно, что-то типа
function markThisRouteAs($name) {
if (isArtisanCommand() && getArtisanCommand() === 'route:list') {
$this->pushToRouteList();
}
return false; //продолжаем работу контроллера.
}
Я к тому, что пометка должна происходить до вызова конкретного метода, более того до инстанцирования класса. Максимум, что можно сейчас придумать в рамках обычного исполняемого PHP-кода, это какие-то статические методы типа:
class UserController
{
public static getMarksFor(string $scope) {
if ($scope === 'methods') {
return [
'index' => [
'route' => [
'url' => '/',
]
],
];
}
}
public index(Request $request): Response
{
//...
}
}
Ну кому и как это жизнь облегчит заметно?
Получаем список классов контроллера. Получаем список методов. Вызываем их все, внедряя туда «Роутер*». В контроллере проверяем, если есть внедренный роутер, то получаем маршрут для этого метода. Если маршрут подходит — вызываем этот маршрут, без внедрения роутера.
Костыльно? Да. Более чем. Я бы даже сказал, что звучит еще ужаснее :)
Хуже\медленнее чем вариант с аннотациями? Едва ли.
Расскажите это разработчикам явы или питона, например. Аннотации — это не коментарии. Это метаданные, которые могут использоваться (и успешно используются) для многих целей. В php они тоже широко распространены, хотя пока не включены в спецификацию языка… Пока… https://wiki.php.net/rfc/annotations_v2
В тоже время, если мы говорим про роуты, то тут не все так однозначно. Удаляем комментарий, а проект ломается, я считаю такое поведение неадекватным :)
Идея в том, что Аннотации != Комментарии. Возможно, это дело привычки. Но я бы не советовал бездумно удалять аннотации в проекте на симфони, например…
Аннотации пишутся в комментарии. Значит аннотация = комментарий. А вот комментарий != аннотации.
Я нахожу это костылем :) Впрочем имеющим право на жизнь.
Организация маршрутов в Laravel