Новинки Laravel 8


    Привет, хабр! В преддверии старта курса "Framework Laravel", наш эксперт и по совместительству активный участник российского сообщества Laravel — Виталий Юшкевич, подготовил обзор новинок в Laravel 8. Передаю слово Виталию:


    Всем привет!


    Последний релиз Laravel 8 получился неоднозначным. С одной стороны, появилось много новых инструментов для быстрого старта; улучшена работа фабрик, приведена структура папок в формат "как обычно используется". С другой стороны, в этом релизе существенно изменили подходы к базовой разработке веб-приложений на Laravel, а привычный ui с поддержкой preset бутстрапа и реакта добавляли фиксом отдельной библиотекой после большого количества возмущений со стороны сообщества.


    Давайте посмотрим более внимательно на изменения, как они изменят ландшафт разработки приложений на laravel в будущем.




    Попробуем установить новую версию Laravel и посмотреть на новинки внимательнее.


    Приложение laravel устанавливается с помощью глобально установленного установщика https://github.com/laravel/installer. Если у вас он уже был установлен, то можете изменить зависимость в вашем глобальном composer.json. Он находится по следующему пути:


    ~/.composer/composer.json. 

    Актуальная версия для laravel 8:


    "laravel/installer": "^4.0".

    После сохранения изменений выполните команду:


    composer global update 

    и после новая версия фреймворка будет доступна.


    При создании нового приложения добавился новый флаг:


    --jet             Installs the Laravel Jetstream scaffolding

    Об этом инструменте поговорим отдельно, а пока создадим новое приложение.


    Для установки и работы laravel 8 подняли требования к минимальной версии php до 7.3. Все требования можно посмотреть по ссылке https://laravel.com/docs/8.x/installation#server-requirements


    Изменения


    Изменение структуры директорий модели


    По многочисленным просьбам комьюнити, все модели по-умолчанию теперь размещаются в директории Models с соответствующим namespace (App\Models).


    При этом сохранилась обратная совместимость в работе команды make:model. Если у вас есть директория Models, то при выполнении команды php artisan make:model ModelName новая модель будет автоматически создана в директории Models с соответствующим namespace (App\Models). Если же у вас нет этой директории, то модель создастся в корне app и namespace будет App. Мелочь, а приятно.


    Migration Squashing


    Со временем проект обрастает большим количеством файлов миграций. Это не очень удобно, если вы хотите посмотреть вашу актуальную схему, либо если вам приходится часто выполнять все миграции.


    В Laravel 8 появилась команда schema:dump, которая создает дамп текущей базы в отдельную директорию schema. Если вызвать эту команду с флагом —prune, то все текущие миграции удалятся. При следующих обновлениях базы сначала будет выполняться этот дамп, а затем оставшиеся миграции.


    Model Factory Classes


    В этом релизе была переработана работа с фабриками. Model factory — это полноценный класс, а вызов фабрики осуществляется через вызов метода модели factory() (* Модель должна использовать трейт HasFactory).


    Это существенно упрощает работу с фабриками. Например, теперь гораздо удобнее задавать разные состояния для генерации модели через отдельные методы и при вызове метода make() или create() последовательно применять цепочки состояний. Например,


    User::factory()->active()->subscribed()->client()->make()

    Улучшена работа со связями. Появились 2 волшебных метода: has и for. Например, если мы хотим создать пользователя с 5 постами, мы можем написать:


    User::factory()->has(Post::factory()->count(5))->create()
    более "магичный" вариант тоже будет работать
    User::factory()->hasPosts(5)->create()

    Метод for() работает аналогично для отношений BelongsTo


    Улучшения в работе Maintenance Mode


    У команды php artisan down появились новые флаги:


    --redirect[=REDIRECT]  The path that users should be redirected to
    --render[=RENDER]      The view that should be prerendered for display during maintenance mode
    --retry[=RETRY]        The number of seconds after which the request may be retried
    --secret[=SECRET]      The secret phrase that may be used to bypass maintenance mode
    --status[=STATUS]      The status code that should be used when returning the maintenance mode response [default: "503"]

    Если мы зададим параметр secret, например так:


    php artisan down --secret=my_secret_down_key

    то мы сможем обратиться к сайту по адресу mysite.com/my_secret_down_key, после чего работать с сайтом, как будто он в обычном режиме (выставляется кука). При этом для остальных пользователей приложение будет находится в maintenance режиме.


    Параметр render позволяет отобразить шаблон как финальный html код. Этот параметр можно использовать как для отображения кастомного шаблона (задаем наш шаблон), так и использовать отображение рендера страниц ошибок (—render="errors::503"). Последний вариант использования полезен в следующем — если во время обновления приложения вы выполняете composer update, то ваши зависимости могут поломаться и вывод стандартной заглушки поломаться. Если вы будете использовать render 503 страницы, то вывод не поломается и будет выводится подготовленный заранее шаблон html страницы.


    Улучшена работа с Closure-Based Event Listeners


    Listeners для событий можно объявлять через замыкания. Такой подход может быть оправданным, когда хочется сэкономить на создании отдельных классов (спорное преимущество, на мой взгляд, но имеет место быть).


    Суть улучшения сведена к оптимизациии:


    Раньше нужно было писать так:
    Event::listen(MyEvent::class, function(MyEvent $event) {
        // do smth
    })
    
    Теперь можно писать так:
    Event::listen(function(MyEvent $event) {
        // do smth
    })
    
    Если нужно сделать обработкик queueable, то замыкание нужно обернуть в другое:
    Event::listen(queueable(function(MyEvent $event) {
        // do smth
    }))

    Time Testing helper


    Добавлен новый класс Wormhole, который добавляет для тестирование ряд методов, позволяющих гибко менять "текущую дату", от которой мы хотим протестировать. Есть гибкая поддержка (положительные и отрицательные смещения, изменения в разных единицах — от миллисекунд до лет) изменений текущего времени, а также указания точного времени.


    Пример из документации:


    public function testTimeCanBeManipulated()
    {
        // Travel into the future...
        $this->travel(5)->milliseconds();
        $this->travel(5)->seconds();
        $this->travel(5)->minutes();
        $this->travel(5)->hours();
        $this->travel(5)->days();
        $this->travel(5)->weeks();
        $this->travel(5)->years();
    
        // Travel into the past...
        $this->travel(-5)->hours();
    
        // Travel to an explicit time...
        $this->travelTo(now()->subHours(6));
    
        // Return back to the present time...
        $this->travelBack();
    }

    Улучшена работа rate-limit


    В предыдущей версии rate limit задавался на уровне middleware. Начиная с 8 версии управление rate limit перенесено в RouteServiceProvider через замыкания. Существенно улучшена гибкость работы. Теперь в рамках одного midleware можно настроить разные rate limit, а также устанавливать лимиты для пользователей или по ip (например, привелигированным пользователям дать менее жесткие ограничения).


    JetStream и изменения frontend


    Вместе с этим релизом вышел новый продукт для скаффолдинга на смену пакету UI, динамические компоненты blade. Пожалуй, это одно из самых масштабных изменений этого релиза. Вместе с тем и спорных. Этот пакет обладает достаточно большими возможностями, рассмотрим его подробно в отдельной статье.


    Job batching


    Фасаду Bus добавили новый метод batch() для обработки блоков задач. Можно контролировать запуск следующих методов после выполнения всех задач. Пример кода из документации:


    use App\Jobs\ProcessPodcast;
    use App\Podcast;
    use Illuminate\Bus\Batch;
    use Illuminate\Support\Facades\Bus;
    use Throwable;
    
    $batch = Bus::batch([
        new ProcessPodcast(Podcast::find(1)),
        new ProcessPodcast(Podcast::find(2)),
        new ProcessPodcast(Podcast::find(3)),
        new ProcessPodcast(Podcast::find(4)),
        new ProcessPodcast(Podcast::find(5)),
    ])->then(function (Batch $batch) {
        // All jobs completed successfully...
    })->catch(function (Batch $batch, Throwable $e) {
        // First batch job failure detected...
    })->finally(function (Batch $batch) {
        // The batch has finished executing...
    })->dispatch();
    
    return $batch->id;

    Другие изменения


    Также в этом релизе были добавлены closure для job dispatch, улучшения artisan serve, обновления Routing Namespace и исправления багов. Полный changelog доступ в документации. https://laravel.com/docs/8.x/releases и в репозитории :)


    Вместо итогов


    Этот релиз добавляет удобства в работу, привносит много улучшений. Вместе с тем, нет ощущения, что это был самый сильный релиз Laravel. Изменения по frontend части вызвали достаточно много обсуждений, "вынудив" добавить фиксом старый ui через отдельную библиотеку. Taylor обозначил новый вектор развития фреймворка, с которым многие могут не согласится. Сохранит ли Taylor этот вектор и в следующем релизе? Сохранит ли laravel такие же темпы привлечения людей в свое комьюнити? Время будет единственным судьей.


    На этом всё. По ссылке ниже вы можете записаться на бесплатный вебинар, в рамках которого мы подробно расскажем о программе курса и процессе обучения, а также ответим на интересующие вас вопросы.

    OTUS. Онлайн-образование
    Цифровые навыки от ведущих экспертов

    Комментарии 3

      +1
      Ничего нового (чего нет в оф доке) не узнал, зачем это здесь?
        +1
        Курс по Laravel стартует же )
        +1
        Могу конечно ошибаться, но как по мне точка входа для новичков выше стала, особенно с новым jetstream, который за собой тянет Livewire и Inertia.js, которые как бы не ясно зачем, кроме быстрой авторизации… диктуют как теперь делаем сайты? ладно бы рядом как-то встало это все возле laravel/ui, но тут просто вынесли на нет ui (как минимум в доках).
        laravel/ui теперь будут поддерживать или нет -вопрос, благо хоть laravel/fortify есть

        забыли еще про tailwind на который пока больно смотреть во вьюхах

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое