Skip to content

Latest commit

 

History

History
470 lines (320 loc) · 29.8 KB

releases.md

File metadata and controls

470 lines (320 loc) · 29.8 KB

Laravel 9 · Примечания к релизу

Схема версионирования

Laravel и другие его собственные пакеты следуют Семантическому Версионированию. Мажорные релизы фреймворка выпускаются каждый год (предположительно февраль), тогда как минорные и патч-релизы могут выпускаться каждую неделю. Минорные и патч-релизы никогда не должны содержать критических изменений.

Ссылаясь на фреймворк Laravel или его компоненты из вашего приложения или пакета, вы всегда должны использовать ограничение версии ^9.0, поскольку мажорные релизы Laravel действительно включают критические изменения. Однако мы всегда стремимся к тому, чтобы вы могли выполнить обновление до новой мажорной версии в течение дня или менее.

Именованные аргументы

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

Политика поддержки

Для всех релизов исправления ошибок предоставляются в течение 18 месяцев, а исправления безопасности – в течение 2 лет. Для всех дополнительных библиотек, включая Lumen, только последний мажорный релиз получает исправления ошибок. Помимо этого, ознакомьтесь с версиями баз данных, которые поддерживает Laravel.

Версия PHP (*) Дата релиза Исправление ошибок до Исправления безопасности до
6 (LTS) 7.2 - 8.0 3 сентября 2019 25 января 2022 6 сентября 2022
7 7.2 - 8.0 3 марта 2020 6 октября 2020 3 марта 2021
8 7.3 - 8.1 8 сентября 2020 26 июля 2022 24 января 2023
9 8.0 - 8.1 8 февраля 2022 8 августа 2023 8 февраля 2024
10 8.1 7 февраля 2023 7 августа 2024 7 февраля 2025

(*) Поддерживаемые версии PHP

Laravel 9

Как вы, возможно, знаете, Laravel перешел на ежегодные релизы с 8-ой версии Laravel. Раньше мажорные релизы выпускались каждые 6 месяцев. Этот переход предназначен для того, чтобы облегчить бремя обслуживания для сообщества и побудить нашу команду разработчиков выпускать потрясающие, мощные новые функции без внесения критических изменений. Поэтому мы добавили в Laravel 8 множество надежных функций без нарушения обратной совместимости, таких как поддержка параллельного тестирования, улучшенные стартовые комплекты Breeze, улучшения HTTP-клиента и даже новые типы отношений Eloquent, такие как «has one of many».

Поэтому это обязательство по выпуску замечательных новых функций в текущем релизе, вероятно, приведет к тому, что будущие «мажорные» релизы будут в основном использоваться для задач «обслуживания», таких как обновление вышестоящих зависимостей, что можно увидеть в этих примечаниях к релизу.

Laravel 9 продолжает улучшения, сделанные в Laravel 8.x, путем введения поддержки компонентов Symfony 6.0, Symfony Mailer, Flysystem 3.0, улучшенного вывода route:list, драйвера database Laravel Scout, нового синтаксиса аксессоров / мутаторов Eloquent, неявных привязок маршрутов с типизированными перечислениями и множество других исправлений ошибок и улучшений юзабилити.

PHP 8.0

Laravel 9.x теперь требует минимальную версию PHP 8.0.

Symfony Mailer

Авторы: Dries Vints, James Brooks и Julius Kiekbusch.

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

Ознакомьтесь с руководством по обновлению, чтобы узнать больше о том, как обеспечить совместимость вашего приложения с Symfony Mailer.

Flysystem 3.x

Автор: Dries Vints.

Laravel 9.x обновляет зависимость Flysystem до 3.x. Flysystem поддерживает все взаимодействия с файловой системой, предлагаемые фасадом Storage.

Ознакомьтесь с руководством по обновлению, чтобы узнать больше о том, как обеспечить совместимость вашего приложения с Flysystem 3.x.

Улучшенные аксессоры / мутаторы Eloquent

Автор: Taylor Otwell.

Laravel 9.x предлагает новый способ определения аксессоров и мутаторов Eloquent. В предыдущих релизах Laravel единственным способом определения аксессоров и мутаторов было определение префиксных методов в вашей модели следующим образом:

public function getNameAttribute($value)
{
    return strtoupper($value);
}

public function setNameAttribute($value)
{
    $this->attributes['name'] = $value;
}

Однако в Laravel 9.x вы можете определить аксессор и мутатор, используя один метод без префикса, указав возвращаемый тип Illuminate\Database\Eloquent\Casts\Attribute:

use Illuminate\Database\Eloquent\Casts\Attribute;

public function name(): Attribute
{
    return new Attribute(
        get: fn ($value) => strtoupper($value),
        set: fn ($value) => $value,
    );
}

Кроме того, этот новый подход к определению методов доступа будет кэшировать значения объектов, которые возвращаются атрибутом, точно так же, как пользовательские классы типизации:

use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;

public function address(): Attribute
{
    return new Attribute(
        get: fn ($value, $attributes) => new Address(
            $attributes['address_line_one'],
            $attributes['address_line_two'],
        ),
        set: fn (Address $value) => [
            'address_line_one' => $value->lineOne,
            'address_line_two' => $value->lineTwo,
        ],
    );
}

Типизация Enum атрибутов модели Eloquent

Предупреждение
Перечисляемые типы доступны только в PHP 8.1+.

Автор: Mohamed Said.

Eloquent также позволяет вам преобразовывать значения ваших атрибутов в типизированные перечисления PHP. Для этого вы можете указать атрибут, который вы хотите типизировать, и соответствующий класс перечисления в массиве $casts вашей модели:

use App\Enums\ServerStatus;

/**
 * Атрибуты, которые должны быть типизированы.
 *
 * @var array
 */
protected $casts = [
    'status' => ServerStatus::class,
];

После того, как вы определили типизацию в своей модели, указанный атрибут будет автоматически преобразован в перечисляемый тип и из него при взаимодействии с атрибутом:

if ($server->status == ServerStatus::provisioned) {
    $server->status = ServerStatus::ready;

    $server->save();
}

Неявная привязка в маршрутах с типизированными перечислениями

Автор: Nuno Maduro.

В PHP 8.1 появилась поддержка типизированных перечислений. Laravel 9.x позволяет вам указывать типизированным перечислением в определении вашего маршрута, и Laravel будет вызывать маршрут только в том случае, если этот сегмент маршрута соответствует допустимому значению перечисления. В противном случае будет автоматически возвращен 404-ый ответ HTTP. Например, учитывая следующее определение перечисления:

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

Вы можете определить маршрут, который будет вызываться только в том случае, если сегмент маршрута {category} имеет значение fruits или people. В противном случае Laravel вернет 404-ый ответ HTTP:

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

Принудительные ограничения привязки маршрута

Автор: Claudio Dekker.

В предыдущих релизах Laravel при желании можно было ограничить вторую модель Eloquent в определении маршрута, чтобы она была дочерней по отношению к предыдущей модели Eloquent. Например, рассмотрим это определение маршрута, которое извлекает пост в блоге по slug для конкретного пользователя:

use App\Models\Post;
use App\Models\User;

Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});

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

Однако в Laravel 9.x теперь вы можете указать Laravel ограничить «дочерние» привязки, даже если ключ не был предоставлен. Для этого вы можете вызвать метод scopeBindings при определении вашего маршрута:

use App\Models\Post;
use App\Models\User;

Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
    return $post;
})->scopeBindings();

Или вы можете указать в определении группы маршрутов использовать ограничения привязки:

Route::scopeBindings()->group(function () {
    Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
        return $post;
    });
});

Контроллер для группы маршрутов

Автор: Luke Downing.

Вы можете использовать метод controller, чтобы определить общий контроллер для всех маршрутов в группе. Затем при определении маршрутов вам нужно только указать метод контроллера, который они вызывают:

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});

Полнотекстовые индексы и выражения where

Авторы: Taylor Otwell и Dries Vints.

При использовании MySQL или PostgreSQL теперь для создания полнотекстовых индексов может быть добавлен метод fullText к определениям столбцов:

$table->text('bio')->fullText();

Методы whereFullText и orWhereFullText полнотекстового поиска можно использовать для добавления условий where в запрос для столбцов, которые имеют полнотекстовые индексы. Эти методы будут преобразованы Laravel в соответствующий SQL базы данных. Например, предложение MATCH AGAINST будет создано для приложений, использующих MySQL:

$users = DB::table('users')
           ->whereFullText('bio', 'web developer')
           ->get();

Поисковая система database для Laravel Scout

Авторы: Taylor Otwell и Dries Vints.

Если ваше приложение взаимодействует с базами данных малого и среднего размера или имеет небольшую рабочую нагрузку, то вам может быть удобнее начать работу с поисковой системой database Scout вместо Algolia или MeiliSearch. Поисковая система базы данных будет использовать выражения where like и полнотекстовые индексы при фильтрации результатов из вашей существующей базы данных, чтобы определить применимые результаты поиска для вашего запроса.

Чтобы узнать больше о поисковой системе database для Scout, обратитесь к документации Scout.

Отрисовка встроенных шаблонов Blade

Авторы: Jason Beggs и Toby Zerner.

Иногда требуется преобразовать строку шаблона Blade в HTML. Вы можете сделать это, используя метод render фасада Blade. Метод render принимает строку шаблона Blade и необязательный массив данных для шаблона:

use Illuminate\Support\Facades\Blade;

return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);

Точно так же метод renderComponent может использоваться для отрисовки переданного класса компонента путем передачи экземпляра компонента в метод:

use App\View\Components\HelloComponent;

return Blade::renderComponent(new HelloComponent('Julian Bashir'));

Упрощение в именовании слота

Автор: Caleb Porzio.

В предыдущих релизах Laravel имена слотов определялись с использованием атрибута name в теге x-slot:

<x-alert>
    <x-slot name="title">
        Server Error
    </x-slot>

    <strong>Whoops!</strong> Something went wrong!
</x-alert>

Однако, начиная с Laravel 9.x, вы можете указать имя слота, используя удобный, более короткий синтаксис:

<x-slot:title>
    Server Error
</x-slot>

Отмеченные / Выделенные элементы интерфейса

Авторы: Ash Allen и Taylor Otwell.

Для удобства вы можете использовать директиву @checked, чтобы указать, должен ли быть «отмечен» HTML-флажок. Эта директива выведет checked, если переданное условие является истинным:

<input type="checkbox"
        name="active"
        value="active"
        @checked(old('active', $user->active)) />

Аналогично, директива @selected может использоваться для указания, следует ли «выбрать» указанный элемент выпадающего списка:

<select name="version">
    @foreach ($product->versions as $version)
        <option value="{{ $version }}" @selected(old('version') == $version)>
            {{ $version }}
        </option>
    @endforeach
</select>

Шаблоны Bootstrap 5 для постраничной навигации

Автор: Jared Lewis.

Laravel теперь содержит шаблоны для постраничной навигации, созданные с помощью Bootstrap 5. Чтобы использовать эти шаблоны вместо шаблонов Tailwind по умолчанию, вы можете вызвать метод пагинатора useBootstrapFive в методе boot поставщика App\Providers\AppServiceProvider:

use Illuminate\Pagination\Paginator;

/**
 * Загрузка любых служб приложения.
 *
 * @return void
 */
public function boot()
{
    Paginator::useBootstrapFive();
}

Улучшенная валидация данных вложенного массива

Автор: Steve Bauman.

Иногда требуется получить доступ к значению переданного вложенного элемента массива при назначении правил валидации для атрибута. Вы можете сделать это, используя метод Rule::foreEach. Метод forEach принимает замыкание, которое будет вызываться для каждой итерации проверяемого атрибута массива, и будет получать значение атрибута и явное, полностью развернутое имя атрибута. Замыкание должно возвращать массив правил предназначенных элементу массива:

use App\Rules\HasPermission;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

$validator = Validator::make($request->all(), [
    'companies.*.id' => Rule::forEach(function ($value, $attribute) {
        return [
            Rule::exists(Company::class, 'id'),
            new HasPermission('manage-company', $value),
        ];
    }),
]);

Laravel Breeze API и Next.js

Авторы: Taylor Otwell и Miguel Piedrafita.

Стартовый комплект Laravel Breeze получил режим формирования «API» и реализацию внешнего интерфейса на Next.js. Этот стартовый комплект может использоваться для быстрого запуска ваших приложений Laravel, которые служат в качестве бэкэнда с аутентификацией API для внешнего интерфейса JavaScript через Laravel Sanctum.

Улучшенная страница исключения Ignition

Автор: Spatie.

Ignition – страница отладки исключений с открытым исходным кодом, созданная Spatie, была переработана с нуля. Ignition поставляется с Laravel 9.x и включает в себя светлые / темные темы, настраиваемую функцию «открыть в редакторе» и многое другое.

Красивый вывод консольной команды route:list

Автор: Nuno Maduro.

Вывод route:list был значительно улучшен в Laravel 9.x и предлагает новый вид при обзоре ваших определений маршрутов.

Отчет о покрытии тестами при использовании команды test Artisan

Автор: Nuno Maduro.

Команда test Artisan получила новую опцию --coverage, которую вы можете использовать для изучения объема покрытия кода, которое ваши тесты предоставляют вашему приложению:

php artisan test --coverage

Результаты покрытия тестами будут отображаться непосредственно при выводе в CLI.

Вы можете использовать параметр --min, чтобы определить минимальный порог покрытия тестами вашего приложения. Набор тестов завершится ошибкой, если этот порог не будет достигнут:

php artisan test --coverage --min=80.3

Сервер Soketi Echo

Автор: Alex Renoki.

Хотя это не является эксклюзивным для Laravel 9.x, Laravel недавно помог с документацией Soketi, совместимого с Laravel Echo сервера Web Socket, написанного для Node.js. Soketi предоставляет отличную альтернативу Pusher и Ably с открытым исходным кодом для тех приложений, которые предпочитают управлять собственным сервером Web Socket.

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

Улучшенная поддержка IDE для коллекций

Автор: Nuno Maduro.

Laravel 9.x добавляет улучшенные определения типов в компонент коллекций, улучшая поддержку IDE и статического анализа. IDE, такие как PHPStorm или инструменты статического анализа, такие как PHPStan теперь будет лучше понимать коллекции Laravel изначально.

Новые глобальные помощники

Laravel 9.x представляет две новые удобные вспомогательные функции, которые вы можете использовать в своем приложении.

str

Функция str возвращает новый экземпляр Illuminate\Support\Stringable переданной строки. Эта функция эквивалентна методу Str::of:

$string = str('Taylor')->append(' Otwell');

// 'Taylor Otwell'

Если для функции str не указан аргумент, то функция возвращает экземпляр Illuminate\Support\Str:

$snake = str()->snake('LaravelFramework');

// 'laravel_framework'

to_route

Функция to_route генерирует HTTP-ответ перенаправления на именованный маршрут:

return to_route('users.show', ['user' => 1]);

При необходимости вы можете передать код состояния HTTP, который должен быть назначен перенаправлению, и любые дополнительные заголовки ответа в качестве третьего и четвертого аргументов метода to_route, соответственно:

return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);