Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.
Поделитесь своим кодом и идеями!
Поделитесь своим кодом и идеями!

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

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

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

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

Исключения

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

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

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

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

Версия PHP (*) Дата релиза Исправление ошибок до Исправления безопасности до
9 ¹ 8.0 - 8.2 8 февраля 2022 8 августа 2023 6 февраля 2024
10 ² 8.1 - 8.3 14 февраля 2023 6 августа 2024 4 февраля 2025
11 8.2 - 8.3 12 марта 2024 3 сентября 2025 12 марта 2026
12 8.2 - 8.3 Q1 2025 Q3 2026 Q1 2027
¹ Окончание поддержки
² Только исправления безопасности

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

Laravel 11

Laravel 11 продолжает улучшения, сделанные в Laravel 10.x, представляя оптимизированную структуру приложения, ограничение скорости в секунду, маршрутизацию работоспособности, плавную ротацию ключей шифрования, улучшения тестирования очередей, почтовый транспорт Resend, интеграция валидатора Prompt, новые команды Artisan и многое другое. Кроме того, был представлен Laravel Reverb, собственный масштабируемый сервер WebSocket, обеспечивающий надежные возможности работы в реальном времени для ваших приложений.

PHP 8.2

Для Laravel 11.x требуется минимальная версия PHP 8.2.

Оптимизированная структура приложения

Оптимизированная структура приложения Laravel была разработана Тейлором Отвеллом (Taylor Otwell) и Нуно Мадуро (Nuno Maduro).

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

Файл начальной загрузки приложения

Файл bootstrap/app.php был обновлен как файл конфигурации приложения, ориентированный на код. Из этого файла вы теперь можете настроить маршрутизацию вашего приложения, посредников (middleware), поставщиков услуг, обработку исключений и многое другое. Этот файл объединяет различные высокоуровневые настройки поведения приложения, которые ранее были разбросаны по файловой структуре вашего приложения:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Поставщики услуг

Вместо структуры приложения Laravel по умолчанию, содержащей пять поставщиков услуг, Laravel 11 включает только один AppServiceProvider. Функциональность предыдущих поставщиков услуг была включена в bootstrap/app.php, автоматически обрабатывается платформой или может быть помещена в AppServiceProvider вашего приложения.

Например, обнаружение событий теперь включено по умолчанию, что в значительной степени устраняет необходимость ручной регистрации событий и их прослушивателей. Однако если вам необходимо зарегистрировать события вручную, вы можете просто сделать это в AppServiceProvider. Аналогично, привязки модели маршрута или шлюзы авторизации, которые вы, возможно, ранее зарегистрировали в AuthServiceProvider, также могут быть зарегистрированы в AppServiceProvider.

Согласование API и широковещательная маршрутизация

Файлы маршрутов api.php и channels.php больше не присутствуют по умолчанию, поскольку многим приложениям эти файлы не требуются. Вместо этого их можно создать с помощью простых команд Artisan:

php artisan install:api

php artisan install:broadcasting

Посредники (Middleware)

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

В Laravel 11 эти постредники были перенесены в сам фреймворк, чтобы оно не увеличивало объем структуры вашего приложения. В инфраструктуру добавлены новые методы для настройки поведения этих посредников, которые можно вызывать из файла bootstrap/app.php вашего приложения:

->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(
        except: ['stripe/*']
    );

    $middleware->web(append: [
        EnsureUserIsSubscribed::class,
    ])
})

Поскольку все промежуточное программное обеспечение можно легко настроить с помощью файла bootstrap/app.php вашего приложения, необходимость в отдельном классе “kernel” HTTP была устранена.

Планирование (Scheduling)

Используя новый фасад Schedule, запланированные задачи теперь могут быть определены непосредственно в файле routes/console.php вашего приложения, что устраняет необходимость в отдельном классе “kernel” консоли:

use Illuminate\Support\Facades\Schedule;

Schedule::command('emails:send')->daily();

Обработка исключений

Как маршрутизация и посредники, обработка исключений теперь может быть настроена из файла bootstrap/app.php вашего приложения вместо отдельного класса обработчика исключений, что сокращает общее количество файлов, включенных в новое приложение Laravel:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->dontReport(MissedFlightException::class);

    $exceptions->report(function (InvalidOrderException $e) {
        // ...
    });
})

Базовый класс Controller

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

<?php

namespace App\Http\Controllers;

abstract class Controller
{
    //
}

Application Defaults

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

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

Laravel Reverb

Laravel Reverb был разработан Джо Диксоном (Joe Dixon)

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

php artisan reverb:start

Кроме того, Reverb поддерживает горизонтальное масштабирование с помощью возможностей публикации/подписки Redis, что позволяет вам распределять трафик WebSocket между несколькими внутренними серверами Reverb, поддерживающими одно востребованное приложение.

Для получения дополнительной информации о Laravel Reverb обратитесь к полной документации по Reverb.

Ограничение посекундной скорости

Посекундное ограничение скорости было предоставлено Тимом Макдональдом (Tim MacDonald).

Laravel теперь поддерживает “посекундное” ограничение скорости для всех ограничителей скорости, включая ограничения для HTTP-запросов и заданий в очереди. Раньше ограничители скорости Laravel были ограничены поминутной детализацией:

RateLimiter::for('invoices', function (Request $request) {
    return Limit::perSecond(1);
});

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

Маршрутизация здоровья

Маршрутизацию работоспособности предоставил Тейлор Отвелл (Taylor Otwell).

Новые приложения Laravel 11 включают директиву маршрутизации health, которая инструктирует Laravel определить простую конечную точку проверки работоспособности, которая может быть вызвана сторонними службами мониторинга работоспособности приложений или системами оркестрации, такими как Kubernetes. По умолчанию этот маршрут обслуживается по адресу /up:

->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
)

Когда HTTP-запросы отправляются по этому маршруту, Laravel также отправляет событие DiagnosingHealth, позволяющее вам выполнять дополнительные проверки работоспособности, имеющие отношение к вашему приложению.

Грациозная ротация ключей шифрования

Изящную ротацию ключей шифрования предоставил Тейлор Отвелл (Taylor Otwell).

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

Laravel 11 позволяет вам определять предыдущие ключи шифрования вашего приложения в виде списка, разделенного запятыми, через переменную среды APP_PREVIOUS_KEYS.

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

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

Дополнительную информацию о шифровании в Laravel можно найти в документации по шифрованию.

Автоматическое изменение (rehashing) пароля

Автоматическое изменение (rehashing) пароля было предоставлено Стивеном Рис-Картером (Stephen Rees-Carter).

Алгоритм хеширования паролей в Laravel по умолчанию — bcrypt. «Рабочий коэффициент» для хешей bcrypt можно настроить с помощью файла конфигурации config/hashing.php или переменной среды BCRYPT_ROUNDS.

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

Валидатор Prompt

Интеграцию валидатора Prompt предоставил Андреа Марко Сартори (Andrea Marco Sartori).

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

Laravel Prompts поддерживает проверку ввода через замыкания:

$name = text(
    label: 'What is your name?',
    validate: fn (string $value) => match (true) {
        strlen($value) < 3 => 'The name must be at least 3 characters.',
        strlen($value) > 255 => 'The name must not exceed 255 characters.',
        default => null
    }
);

Однако это может стать затруднительным при работе со многими входными данными или сложными сценариями проверки. Таким образом, в Laravel 11 вы можете использовать всю мощь валидатора Laravel при проверке ввода подсказки:

$name = text('What is your name?', validate: [
    'name' => 'required|min:3|max:255',
]);

Тестирование взаимодействия с очередью

Тестирование взаимодействия с очередью было предоставлено Тейлор Отвелл (Taylor Otwell).

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

use App\Jobs\ProcessPodcast;

$job = (new ProcessPodcast)->withFakeQueueInteractions();

$job->handle();

$job->assertReleased(delay: 30);

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

Новые команды Artisan

Команды Artisan для создания классов были предоставлены Тейлор Отвелл (Taylor Otwell).

Были добавлены новые команды Artisan, позволяющие быстро создавать классы, перечисления, интерфейсы и особенности:

php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait

Улучшения приведения моделей

Улучшения приведения моделей были внесены Нуно Мадуро (Nuno Maduro).

Laravel 11 поддерживает определение приведения модели с использованием метода, а не свойства. Это позволяет упростить и плавно определить приведение типов, особенно при использовании приведения с аргументами:

/**
 * Get the attributes that should be cast.
 *
 * @return array<string, string>
 */
protected function casts(): array
{
    return [
        'options' => AsCollection::using(OptionCollection::class),
                  // AsEncryptedCollection::using(OptionCollection::class),
                  // AsEnumArrayObject::using(OptionEnum::class),
                  // AsEnumCollection::using(OptionEnum::class),
    ];
}

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

Функция once

Помощник once был предоставлен Тейлор Отвелл (Taylor Otwell) и Нуно Мадуро (Nuno Maduro).

Вспомогательная функция once выполняет заданный обратный вызов и кэширует результат в памяти на время выполнения запроса. Любые последующие вызовы функции once с тем же обратным вызовом будут возвращать ранее кэшированный результат:

function random(): int
{
    return once(function () {
        return random_int(1, 1000);
    });
}

random(); // 123
random(); // 123 (cached result)
random(); // 123 (cached result)

Дополнительную информацию о помощнике once можно найти в документации по помощникам.

Улучшенная производительность при тестировании с базами данных в памяти.

Улучшение производительности тестирования баз данных в памяти было предоставлено Андерсом Дженбо (Anders Jenbo)

Laravel 11 предлагает значительный прирост скорости при использовании базы данных :memory: SQLite во время тестирования. Для достижения этой цели Laravel теперь поддерживает ссылку на объект PDO PHP и повторно использует его при различных соединениях, часто сокращая общее время выполнения теста вдвое.

Улучшенная поддержка MariaDB.

Улучшенную поддержку MariaDB предоставили Йонас Штауденмейр (Jonas Staudenmeir) и Юлиус Киекбуш (Julius Kiekbusch)

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

Дополнительную информацию о драйверах базы данных Laravel можно найти в документации по базе данных.

Проверка баз данных и улучшенные операции со схемой

Улучшение операций со схемой и проверка базы данных предоставлено Хафезом Дивандари (Hafez Divandari)

Laravel 11 предоставляет дополнительные методы работы и проверки схемы базы данных, включая встроенное изменение, переименование и удаление столбцов. Кроме того, предоставляются расширенные пространственные типы, имена схем, отличные от стандартных, и собственные методы схемы для управления таблицами, представлениями, столбцами, индексами и внешними ключами:

use Illuminate\Support\Facades\Schema;

$tables = Schema::getTables();
$views = Schema::getViews();
$columns = Schema::getColumns('users');
$indexes = Schema::getIndexes('users');
$foreignKeys = Schema::getForeignKeys('users');