Pull to refresh

Comments 29

UFO just landed and posted this here
На самом деле в боевом проекте действительно мешает.
У меня в одном веб-роуте как админка, так и веб. Почти 50-60 строк. Это очень неудобно.
а что хорошего в том, что ваш код нужно очень хорошо вычитывать, вместо того, чтобы просто разложить всё «по полочкам».
UFO just landed and posted this here

Зачем вам вычитывать сотни роутов за раз?

UFO just landed and posted this here

Я бы в своём коде не стал под это закладываться, извините, если достанется когда-нибудь мой, а там всё по файликам/папочкам разложено

По полочкам можно разложить просто нормально комментируя если проект не огромный, тем более как часто Вам нужно всматриваться, если код на боевом сервере? На локалке все равно они в «Route::group» обычно, и IDE все нормально показывает-прячет.
ЗЫ. Если проект прям совсем с разнородными бизнес процессами можно разделять на модуля. Аля nwidart/laravel-modules.

Простите, не совсем понял.
Вы оставили те же файлы, которые есть по умолчанию. Добавили admin.php (который, в случае с подключаемыми админками тоже сам создается) и user.php (а что именно в нем должно быть? Route::auth()?)
Как решение убрать api и web в свои поддериктории помогло избавиться от 200 строк маршрутов?

Добавлю, что избавиться от большого количество строк в роутах поможет Route::resource

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('/');
});

Подскажите, где должна быть валидация как не в контроллере(не сарказм, интересно мнение знающих людей)?
А в ситуации, когда валидировать нужно по условию?
 Это так или иначе обычный PHP класс, в котором можно писать любую логику
в реквесте вам прилетает массив картинок, каждую нужно провалидировать, как быть в этом случае?
Два варианта.
Первый — простой и топорный:
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` и вычитывайте, сколько хотите :)
UFO just landed and posted this here
Это ужасный способ. Отвратительный. Самое худшее что можно придумать.

Комментарии — для людей (+IDE в которой тоже работают люди).
Код — для интерпретатора.

Если вам нравится помечать роут из контроллера (оставим целесообразность за скобками) — придумайте что-нибудь типа $this->markThisRouteAs('IndexPage');

Это занимает ту же самую одну строчку, но теперь это абсолютно валидный php код, который не основан на магии, легко отслеживается и позволяет отладку.
Если вам нравится помечать роут из контроллера (оставим целесообразность за скобками) — придумайте что-нибудь типа $this->markThisRouteAs('IndexPage');

И когда оно выполнится? Когда кто-то дернёт урл индекса? :)

И когда кто-то дернет URL тоже :) Я не обещал хорошее решение :)
А так, придумать вариант вполне можно, что-то типа
Осторожно, может вызвать желание убивать
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 
  {
    //...
  }
}

Ну кому и как это жизнь облегчит заметно?

В целом можно делать примерно так же, как и LaravelCollective/annotations.

Получаем список классов контроллера. Получаем список методов. Вызываем их все, внедряя туда «Роутер*». В контроллере проверяем, если есть внедренный роутер, то получаем маршрут для этого метода. Если маршрут подходит — вызываем этот маршрут, без внедрения роутера.

Костыльно? Да. Более чем. Я бы даже сказал, что звучит еще ужаснее :)
Хуже\медленнее чем вариант с аннотациями? Едва ли.

Расскажите это разработчикам явы или питона, например. Аннотации — это не коментарии. Это метаданные, которые могут использоваться (и успешно используются) для многих целей. В php они тоже широко распространены, хотя пока не включены в спецификацию языка… Пока… https://wiki.php.net/rfc/annotations_v2

В Java Transient и deprecated вполне несут в себе роль комментария — отличная идея и реализация как по мне. Стандартизация плюсом опять таки. Убрать их — проект все еще работает и абсолютно валиден.

В тоже время, если мы говорим про роуты, то тут не все так однозначно. Удаляем комментарий, а проект ломается, я считаю такое поведение неадекватным :)

Идея в том, что Аннотации != Комментарии. Возможно, это дело привычки. Но я бы не советовал бездумно удалять аннотации в проекте на симфони, например…

Примерно такое и было мое знакомство в симфони в свое время :) Скопировал свойство в модели, вроде все по аналогии, но ничего не работает. Оказывается комменты нужно тоже было копировать, а еще и редактировать. Не скажу что я был в восторге :)

Аннотации пишутся в комментарии. Значит аннотация = комментарий. А вот комментарий != аннотации.

Я нахожу это костылем :) Впрочем имеющим право на жизнь.
Sign up to leave a comment.

Articles