В феврале 2023 года вышел новый релиз одного из главных фреймворков в PHP — Laravel 10. Рассказываем, как перейти на новую версию и какие главные изменения в ней произошли.
- Как установить Laravel 10
- Laravel 10: что нового
- Laravel Pennant: флаги функций
- Управление внешними процессами
- Выявление медленных тестов
- Использование вызываемых правил валидации по умолчанию
- Скелет Laravel 10 использует нативные типы вместо DocBlocks
- В официальных пакетах тоже используются нативные типы
- Путь сохранения файлов конфигурации
- Для изменения столбцов в миграциях больше не требуется doctrine/dbal
- Какие еще изменения произошли, что устарело или удалено
- Как поучаствовать в разработке 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
- Изучите проекты на GitHub.
- Ознакомьтесь с пулл-реквестами и узнайте, что уже сделано.
- Если вы столкнулись с проблемой при использовании фреймворка, придумайте решение.
- Отправьте пулл-реквест в репозиторий laravel/framework, получите обратную связь, внесите изменения — и пулл-реквест будет включен в основной репозиторий.
Чтобы повысить шансы на успех, предложите изменение, которое будет полезно для разработчиков фреймворка, но не будет требовать от них постоянного внимания и дальнейших усилий.
Кстати, Тэйлор Отвел объявил конкурс, в котором предложил пользователям сообщать об ошибках в Laravel 10. Главный приз — $1000.
Правила конкурса:
- Учитываются только пулл-реквесты в ветке 10.x репозитория laravel/framework
- Принимаются только исправления ошибок. Пользователи не могут предлагать новые функции, рефакторинг кода или исправления опечаток
- При исправление ошибки нужно написать тесты
- Если исправление ошибки принято, пользователь участвует в конкурсе
- После выхода стабильной версии Laravel 10 случайным образом будет выбран победитель, который получит тысячу долларов
Узнать о конкурсе подробнее можно в официальном блоге Laravel: Laravel 10 Bug Hunt. Если вы чувствуете, что для участия в таких конкурсах вам нужно набраться еще немного знаний и научиться делать пулл-реквесты, можете попробовать свои силы в опенсорс-проектах Хекслета. Подробнее о них можно прочитать в этой статье.
Эта статья — адаптированный перевод материала фулстек-разработчика Бенджамина Крозата, опубликованного в его личном блоге. Мнение редакции Хекслета может не совпадать с мнением автора.
Изучите Laravel на Хекслете Пройдите наш курс «PHP: Разработка на Laravel», чтобы еще подробнее познакомиться с веб-фреймворком и научиться быстро разрабатывать сайты на Laravel.