Главная | Все статьи | Код

Вышел Laravel 10: разбираем главные изменения

PHP Время чтения статьи ~11 минут
Вышел Laravel 10: разбираем главные изменения главное изображение

В феврале 2023 года вышел новый релиз одного из главных фреймворков в PHP — Laravel 10. Рассказываем, как перейти на новую версию и какие главные изменения в ней произошли.

Как установить Laravel 10

Установить новую версию фреймворка можно с помощью официального установщика Laravel:

laravel new test-app

Также это можно сделать через пакетный менеджер Composer:

composer create-project --prefer-dist laravel/laravel test-app

Чтобы подготовиться к обновлению и автоматизировать процесс, ознакомьтесь с руководством по обновлению до Laravel 10.

Читайте также: Почему Laravel — один из лучших PHP-фреймворков для стартапов и энтерпрайза

Laravel 10: что нового

Laravel Pennant: флаги функций

С помощью пакета Laravel Pennant в проект Laravel 10 теперь можно добавлять фиче-тогглер.

composer require laravel/pennant

Фиче-тогглер позволяет включать и отключать функции во время выполнения кода без внесения изменений. Это может пригодиться, если доступ к функции предоставляется ограниченному числу пользователей, например, при A/B-тестировании или при постепенном добавлении возможностей, когда мы не можем сразу ее включить.

use Laravel\Pennant\Feature;
use Illuminate\Support\Lottery;

Feature::define('new-onboarding-flow', function () {
    return Lottery::odds(1, 10);
});

Проверяем, доступна ли функция пользователю:

if (Feature::active('new-onboarding-flow')) {
    //
}

Также доступна директива Blade:

@feature('new-onboarding-flow')
    ...
@endfeature

Узнать о Laravel Pennant подробнее можно в официальной документации и пошаговой инструкции Laravel News.

Управление внешними процессами

Простой и универсальный интерфейс для работы с компонентом Symfony Process позволяет запускать внешние процессы в приложении Laravel.

Команды для запуска процессов:

use Illuminate\Support\Facades\Process;

$result = Process::run('ls -la');

return $result->output();

Одновременно можно запускать несколько процессов.

use Illuminate\Process\Pool;
use Illuminate\Support\Facades\Pool;

[$first, $second, $third] = Process::concurrently(function (Pool $pool) {
    $pool->command('cat first.txt');
    $pool->command('cat second.txt');
    $pool->command('cat third.txt');
});

return $first->output();

Узнайте о процессах подробнее в официальной документации. Смотрите также пулл-реквест на GitHub: [10.x] Process DX Layer.

Выявление медленных тестов

В новой версии Laravel команда php artisan test получила опцию --profile, с помощью которой можно выявлять медленные тесты. Она доступна в седьмой версии пакета nunomaduro/collision. При переходе с Laravel 9 на Laravel 10 обновите версию пакета при апгрейде.

Использование вызываемых правил валидации по умолчанию

В Laravel 9 пользователи создавали вызываемые правила валидации с помощью флага --invokable в команде php artisan make:rule. В новой версии этого делать не нужно.

php artisan make:rule Uppercase

Вызываемые правила валидации выглядят так:

namespace App\Rules;

use Illuminate\Contracts\Validation\InvokableRule;

class Uppercase implements InvokableRule
{
    /**
     * Run the validation rule.
     *
     * @param string $attribute
     * @param mixed $value
     * @param Closure(string): Illuminate\Translation\PotentiallyTranslatedString $fail
     * @return void
     */
    public function __invoke($attribute, $value, $fail)
    {
        if (strtoupper($value) !== $value) {
            $fail('The :attribute must be uppercase.');
        }
    }
}

Смотрите также пулл-реквест на GitHub: [10.x] Make invokable rules default.

Читайте также: Язык программирования PHP: рейтинг, сферы применения, прогнозы экспертов

Скелет Laravel 10 использует нативные типы вместо DocBlocks

Начиная с десятой версии фреймворк будет использовать при генерации кода нативные типы вместо DocBlocks.

Сгенерированный метод schedule() в app/Console/Kernel.php теперь будет выглядеть выглядеть так:

/**
 * Define the application's command schedule.
- * 
- * @param  Illuminate\Console\Scheduling\Schedule  $schedule
- * @return void
 */
- protected function schedule($schedule)
+ protected function schedule(Schedule $schedule): void

Еще разработчики добавили обобщенные аннотации типов, что поможет IDE в автокомплите кода. Смотрите также пулл-реквест на GitHub: [10.x] Uses PHP Native Type Declarations 🐘.

В официальных пакетах тоже используются нативные типы

Для использования нативных аннотаций типов в официальных пакетах Laravel не нужно ждать перехода на Laravel 10. Создатель Laravel Тэйлор Отвел сообщил об этом в Твиттере: «В Laravel 10.x мы добавляем в пользовательский код аннотации типов. Это изменение доступно во всех пакетах нашей экосистемы, включая заглушки и стартовые наборы. Мы уже внедряем некоторые из этих изменений в пакеты Breeze и Jetstream».

Ознакомьтесь с пулл-реквестом, который инициирует переход от DocBlocks к нативным аннотациям в Laravel Jetstream.

Путь сохранения файлов конфигурации

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

В файле *bootstrap/app.php используйте метод configPath() для объекта $app.

$app->configPath(__DIR__ . '/../some/path');

Кстати, bootstrapPath()databasePath()langPath() и другие подобные функции предлагают широкие возможности для настройки фреймворка. Подробнее можно почитать здесь: [10.x] Config path customization.

Для изменения столбцов в миграциях больше не требуется doctrine/dbal

Для изменения столбцов в миграциях раньше нужно было установить пакет doctrine/dbal. Теперь миграции поддерживают нативные операции большинства баз данных, с которыми работает Laravel.

Допустим, в приложении много связей с базами данных, и уже установлен слой Doctrine DBAL. Чтобы использовать нативные операции, нужно вызвать метод Schema::useNativeSchemaOperationsIfPossible() прежде, чем полагаться на пакет. Например, SQLite пока не поддерживает такую возможность.

use Illuminate\Support\Facades\Schema;

...

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Schema::useNativeSchemaOperationsIfPossible();
    }
}

Подробнее:

  • [10.x] Add support for native column modifying
  • [9.x] Add support for native rename/drop column commands

Читайте также: «Комьюнити у PHP сейчас одно из самых активных»: интервью c разработчиком Yii Framework Александром Макаровым

Какие еще изменения произошли, что устарело или удалено

Для работы Laravel 10 требуется как минимум Composer 2.2

Чтобы у каждого проекта Laravel 10 был надежный фундамент, один из пользователей предложил использовать Composer не ниже версии 2.2, вышедшей в декабре 2021 года. Это последняя версия с долгосрочной поддержкой, обновления для которой будут доступны до конца 2023 года. Актуальная версия — Composer 2.5.3.

Подробнее: [10.x] Requires Composer 2.2

Прекращение поддержки PHP 8.0

Laravel 10 не поддерживает PHP 8.0, поэтому для его использования нужно обновиться до PHP 8.1 или PHP 8.2.

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

Смотрите также пулл-реквест на GitHub: [10.x] Drop PHP 8.0.

Прекращение поддержки Predis v1

Если в проекте используется Predis v1, рекомендуем обновиться до v2. Изменения в Predis v2 отражены в журнале изменений.

Смотрите также пулл-реквест на GitHub: [10.x] Drop Predis v1 support.

Вместо Predis можно использовать быстрое нативное расширение PHP Redis, чтобы ускорить работу сайта с большим трафиком.

Удален метод dispatchNow()

Метод dispatchNow() пользовался популярностью, однако в Laravel 9 был признан устаревшим и заменен на dispatchSync(). В Laravel 10 устаревший метод будет удален, советуем найти и заменить его в своих проектах. Это важное изменение, но адаптироваться к нему легко.

Смотрите также пулл-реквест на GitHub: [10.x] Remove deprecated dispatchNow functionality.

Удалены многие устаревшие методы и свойства

Выпустив новую мажорную версию фреймворка, разработчики Laravel смогли отказаться от функций, которые считались устаревшими еще в девятой версии. Обратите на это внимание и внимательно протестируйте приложения в Laravel, прежде чем переходить на 10-ю версию.

В этом помогут пулл-реквесты:

  • [10.x] Remove deprecated Route::home method
  • [10.x] Remove deprecated assertTimesSent
  • [10.x] Remove deprecated method
  • [10.x] Remove deprecated dates property
  • [10.x] Use native php 8.1 array_is_list function
  • [10.x] Remove deprecations

Как поучаствовать в разработке Laravel 10

  1. Изучите проекты на GitHub.
  2. Ознакомьтесь с пулл-реквестами и узнайте, что уже сделано.
  3. Если вы столкнулись с проблемой при использовании фреймворка, придумайте решение.
  4. Отправьте пулл-реквест в репозиторий laravel/framework, получите обратную связь, внесите изменения — и пулл-реквест будет включен в основной репозиторий.

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

Кстати, Тэйлор Отвел объявил конкурс, в котором предложил пользователям сообщать об ошибках в Laravel 10. Главный приз — $1000.

Правила конкурса:

  • Учитываются только пулл-реквесты в ветке 10.x репозитория laravel/framework
  • Принимаются только исправления ошибок. Пользователи не могут предлагать новые функции, рефакторинг кода или исправления опечаток
  • При исправление ошибки нужно написать тесты
  • Если исправление ошибки принято, пользователь участвует в конкурсе
  • После выхода стабильной версии Laravel 10 случайным образом будет выбран победитель, который получит тысячу долларов

Узнать о конкурсе подробнее можно в официальном блоге Laravel: Laravel 10 Bug Hunt. Если вы чувствуете, что для участия в таких конкурсах вам нужно набраться еще немного знаний и научиться делать пулл-реквесты, можете попробовать свои силы в опенсорс-проектах Хекслета. Подробнее о них можно прочитать в этой статье.

Эта статья — адаптированный перевод материала фулстек-разработчика Бенджамина Крозата, опубликованного в его личном блоге. Мнение редакции Хекслета может не совпадать с мнением автора.

Изучите Laravel на Хекслете Пройдите наш курс «PHP: Разработка на Laravel», чтобы еще подробнее познакомиться с веб-фреймворком и научиться быстро разрабатывать сайты на Laravel.

Пройти курс

Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 7 ноября
профессия
от 14 960 ₸ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 7 ноября
профессия
от 24 542 ₸ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 7 ноября
профессия
от 28 908 ₸ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 7 ноября
профессия
от 39 525 ₸ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 7 ноября
профессия
от 25 000 ₸ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 7 ноября
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
Старт 7 ноября