Примечания к выпуску
Схема управления версиями
Laravel и другие его собственные пакеты следуют Semantic Versioning. Основные выпуски фреймворка выпускаются каждый год (~февраль), в то время как второстепенные выпуски и выпуски исправлений могут выпускаться каждую неделю. Второстепенные выпуски и выпуски исправлений никогда не должны содержать критических изменений.
При ссылке на фреймворк Laravel или его компоненты из Вашего приложения или пакета Вы всегда должны использовать ограничение версии, такое как ^8.0
, поскольку основные выпуски Laravel действительно включают критические изменения. Однако мы всегда стремимся к тому, чтобы Вы могли выполнить обновление до новой основной версии в течение одного дня или меньше.
Исключения
Именованные аргументы
В настоящее время функции PHP именованные аргументы не подпадают под правила обратной совместимости Laravel. При необходимости мы можем переименовать параметры функции, чтобы улучшить кодовую базу 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.0 - 8.1 | 7 февраля 2023 г. | 7 августа 2024 г. | 7 февраля 2025 г. |
(*) Supported PHP versions
Laravel 8
Laravel 8 продолжает улучшения, сделанные в Laravel 7.x, представляя Laravel Jetstream, классы фабрики моделей, сжатие миграции, пакетирование заданий, улучшенное ограничение скорости, улучшения очереди, динамические компоненты Blade, представления разбивки на страницы Tailwind, помощники по тестированию времени, улучшения в artisan serve
, улучшения прослушивателя событий и множество других исправлений ошибок и улучшений удобства использования.
Laravel Jetstream
Laravel Jetstream был написан Taylor Otwell.
Laravel Jetstream - это красиво оформленный каркас приложений для Laravel. Jetstream обеспечивает идеальную отправную точку для Вашего следующего проекта и включает в себя вход в систему, регистрацию, проверку электронной почты, двухфакторную аутентификацию, управление сеансом, поддержку API через Laravel Sanctum и дополнительное управление командой. Laravel Jetstream заменяет и улучшает устаревшие конструкции пользовательского интерфейса аутентификации, доступные для предыдущих версий Laravel.
Jetstream разработан с использованием Tailwind CSS и предлагает на Ваш выбор Livewire или Inertia.
Каталог Моделей
По многочисленным просьбам сообщества скелет приложения Laravel по умолчанию теперь содержит каталог app/Models
. Надеемся, Вам понравится этот новый дом для Ваших моделей Eloquent! Все соответствующие команды генератора были обновлены, чтобы предполагать, что модели существуют в каталоге app/Models
, если он существует. Если каталог не существует, фреймворк предполагает, что Ваши модели должны быть помещены в каталог app
.
Классы фабрики моделей
Классы фабрики моделей были предоставлены Taylor Otwell.
Eloquent фабрики моделей были полностью переписаны как фабрики на основе классов и улучшены для поддержки первоклассных отношений. Например, UserFactory
, включенный в Laravel, написан так:
<?php namespace Database\Factories; use App\Models\User;use Illuminate\Database\Eloquent\Factories\Factory;use Illuminate\Support\Str; class UserFactory extends Factory{ /** * The name of the factory's corresponding model. * * @var string */ protected $model = User::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name(), 'email' => $this->faker->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; }}
Благодаря новому трейту HasFactory
, доступному для сгенерированных моделей, фабрика моделей может использоваться следующим образом:
use App\Models\User; User::factory()->count(50)->create();
Поскольку фабрики моделей теперь являются простыми классами PHP, преобразования состояний могут быть записаны как методы класса. Кроме того, при необходимости Вы можете добавить любые другие вспомогательные классы в фабрику моделей Eloquent.
Например, Ваша модель User
может находиться в состоянии suspended
, которое изменяет одно из значений ее атрибутов по умолчанию. Вы можете определить свои преобразования состояния, используя метод базовой фабрики state
. Вы можете называть свой метод состояния как угодно. В конце концов, это просто типичный PHP-метод:
/** * Indicate that the user is suspended. * * @return \Illuminate\Database\Eloquent\Factories\Factory */public function suspended(){ return $this->state([ 'account_status' => 'suspended', ]);}
После определения метода преобразования состояния мы можем использовать его так:
use App\Models\User; User::factory()->count(5)->suspended()->create();
Как уже упоминалось, фабрики моделей Laravel 8 содержат первоклассную поддержку отношений. Итак, предполагая, что наша модель User
имеет метод отношения posts
, мы можем просто запустить следующий код для создания пользователя с тремя сообщениями:
$users = User::factory() ->hasPosts(3, [ 'published' => false, ]) ->create();
Чтобы упростить процесс обновления, был выпущен пакет laravel/legacy-factories, обеспечивающий поддержку предыдущей итерации фабрик моделей в Laravel 8.x.
Переписанные фабрики Laravel содержат гораздо больше функций, которые, как мы думаем, вам понравятся. Чтобы узнать больше о фабриках моделей, обратитесь к документации по тестированию баз данных.
Сжатие миграции
Сжатие миграции было предоставлено Taylor Otwell.
По мере создания приложения вы можете со временем накапливать все больше и больше миграций. Это может привести к тому, что Ваш каталог миграции станет раздутым из-за потенциально сотен миграции. Если Вы используете MySQL или PostgreSQL, теперь Вы можете «сжать» свои миграции в один файл SQL. Для начала выполните команду schema:dump
:
php artisan schema:dump // Выгрузите текущую схему базы данных и удалите все существующие миграции...php artisan schema:dump --prune
Когда Вы выполните эту команду, Laravel запишет файл «схемы» в Ваш каталог database/schema
. Теперь, когда Вы пытаетесь перенести свою базу данных, и никакие другие миграции не выполнялись, Laravel сначала выполнит SQL файла схемы. После выполнения команд файла схемы Laravel выполнит все оставшиеся миграции, которые не были частью дампа схемы.
Пакетирование заданий
Пакетирование заданий было предоставлено Taylor Otwell и Mohamed Said.
Функция пакетной обработки заданий Laravel позволяет Вам легко выполнять пакет заданий, а затем выполнять некоторые действия, когда пакет заданий завершился.
Новый метод batch
фасада Bus
может использоваться для отправки пакета заданий. Конечно, пакетирование в первую очередь полезно в сочетании с обратными вызовами завершения. Итак, Вы можете использовать методы then
, catch
и finally
для определения обратных вызовов завершения для пакета. Каждый из этих обратных вызовов получит экземпляр Illuminate\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) { // Все работы успешно завершены...})->catch(function (Batch $batch, Throwable $e) { // Обнаружен сбой первого пакетного задания...})->finally(function (Batch $batch) { // Пакет завершил выполнение...})->dispatch(); return $batch->id;
Чтобы узнать больше о группировке заданий, обратитесь к документации очереди.
Улучшенное ограничение скорости
Улучшения ограничения скорости было предоставлено Taylor Otwell.
Функция ограничителя скорости запросов в Laravel была расширена за счет большей гибкости и мощности, при этом сохранена обратная совместимость с API мидлваров throttle
предыдущей версии.
Ограничители скорости определяются с помощью метода for
фасада RateLimiter
. Метод for
принимает имя ограничителя скорости и замыкание, которое возвращает конфигурацию ограничения, которая должна применяться к маршрутам, которым назначен этот ограничитель скорости:
use Illuminate\Cache\RateLimiting\Limit;use Illuminate\Support\Facades\RateLimiter; RateLimiter::for('global', function (Request $request) { return Limit::perMinute(1000);});
Поскольку обратные вызовы ограничителя скорости получают экземпляр входящего HTTP-запроса, Вы можете динамически создать соответствующее ограничение скорости на основе входящего запроса или аутентифицированного пользователя:
RateLimiter::for('uploads', function (Request $request) { return $request->user()->vipCustomer() ? Limit::none() : Limit::perMinute(100);});
Иногда Вы можете захотеть сегментировать ограничения скорости на какое-то произвольное значение. Например, Вы можете разрешить пользователям получать доступ к заданному маршруту 100 раз в минуту на каждый IP-адрес. Для этого Вы можете использовать метод by
при построении лимита скорости:
RateLimiter::for('uploads', function (Request $request) { return $request->user()->vipCustomer() ? Limit::none() : Limit::perMinute(100)->by($request->ip());});
Ограничители скорости могут быть прикреплены к маршрутам или группам маршрутов с помощью throttle
middleware. Мидлвар принимает имя ограничителя скорости, которое Вы хотите назначить маршруту:
Route::middleware(['throttle:uploads'])->group(function () { Route::post('/audio', function () { // }); Route::post('/video', function () { // });});
Чтобы узнать больше об ограничении скорости, обратитесь к документации по маршрутизации.
Улучшенный режим обслуживания
Улучшения режима обслуживания было предоставлено Taylor Otwell с вдохновением от Spatie.
В предыдущих выпусках Laravel функцию режима обслуживания php artisan down
можно было обойти с помощью «разрешенного списка» IP-адресов, которым был разрешен доступ к приложению. Эта функция была удалена в пользу более простого решения «секрет» / токен.
Находясь в режиме обслуживания, Вы можете использовать параметр secret
, чтобы указать токен обхода режима обслуживания:
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
После перевода приложения в режим обслуживания Вы можете перейти к URL-адресу приложения, соответствующему этому токену, и Laravel выдаст Вашему браузеру файл cookie обхода режима обслуживания:
https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
При доступе к этому скрытому маршруту Вы будете перенаправлены на маршрут /
приложения. Как только cookie будет отправлен Вашему браузеру, Вы сможете просматривать приложение в обычном режиме, как если бы оно не находилось в режиме обслуживания.
Предварительная визуализация представления режима обслуживания
Если Вы используете команду php artisan down
во время развертывания, Ваши пользователи могут иногда сталкиваться с ошибками, если они обращаются к приложению во время обновления Ваших зависимостей Composer или других компонентов инфраструктуры. Это происходит потому, что значительная часть инфраструктуры Laravel должна загружаться, чтобы определить, находится ли Ваше приложение в режиме обслуживания, и отобразить представление режима обслуживания с помощью механизма шаблонов.
По этой причине Laravel теперь позволяет предварительно визуализировать представление режима обслуживания, которое будет возвращено в самом начале цикла запроса. Это представление отображается перед загрузкой любой из зависимостей Вашего приложения. Вы можете выполнить предварительный рендеринг шаблона по Вашему выбору, используя параметр render
команды down
:
php artisan down --render="errors::503"
Отправка замыкания / Цепочка catch
Улучшения внес Mohamed Said.
Используя новый метод catch
, теперь Вы можете обеспечить замыкание, которое должно выполняться, если замыкание в очереди не удалось успешно завершить после исчерпания всех настроенных попыток повтора Вашей очереди:
use Throwable; dispatch(function () use ($podcast) { $podcast->publish();})->catch(function (Throwable $e) { // Эта работа не удалась...});
Динамические компоненты Blade
Динамические компоненты Blade были предоставлены Taylor Otwell.
Иногда Вам может потребоваться визуализировать компонент, но Вы не знаете, какой компонент следует визуализировать, до времени выполнения. В этой ситуации теперь Вы можете использовать встроенный в Laravel компонент dynamic-component
для рендеринга компонента на основе значения или переменной времени выполнения:
<x-dynamic-component :component="$componentName" class="mt-4" />
Чтобы узнать больше о компонентах Blade, обратитесь к документации Blade.
Улучшения прослушивателя событий
Улучшения прослушивателя событий предоставлено Taylor Otwell.
Слушатели событий, основанные на замыкании, теперь могут быть зарегистрированы только путем передачи замыкания методу Event::listen
. Laravel проверит замыкание, чтобы определить, какой тип события обрабатывает слушатель:
use App\Events\PodcastProcessed;use Illuminate\Support\Facades\Event; Event::listen(function (PodcastProcessed $event) { //});
Кроме того, прослушиватели событий на основе замыкания теперь могут быть помечены как стоящие в очереди с помощью функции Illuminate\Events\queueable
:
use App\Events\PodcastProcessed;use function Illuminate\Events\queueable;use Illuminate\Support\Facades\Event; Event::listen(queueable(function (PodcastProcessed $event) { //}));
Как и задания в очереди, вы можете использовать методы onConnection
, onQueue
и delay
для настройки выполнения слушателя в очереди:
Event::listen(queueable(function (PodcastProcessed $event) { //})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));
Если Вы хотите обрабатывать сбои анонимного прослушивателя в очереди, Вы можете обеспечить замыкание метода catch
при определении прослушивателя queueable
:
use App\Events\PodcastProcessed;use function Illuminate\Events\queueable;use Illuminate\Support\Facades\Event;use Throwable; Event::listen(queueable(function (PodcastProcessed $event) { //})->catch(function (PodcastProcessed $event, Throwable $e) { // The queued listener failed...}));
Помощники по тестированию времени
Помощники по тестированию времени были предоставлены Taylor Otwell с вдохновением от Ruby on Rails.
При тестировании Вам может иногда потребоваться изменить время, возвращаемое такими помощниками, как now
или Illuminate\Support\Carbon::now()
. Базовый класс тестирования функций Laravel теперь включает помощников, которые позволяют Вам управлять текущим временем:
public function testTimeCanBeManipulated(){ // Путешествие в будущее... $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(); // Путешествие в прошлое... $this->travel(-5)->hours(); // Путешествие в определенное время... $this->travelTo(now()->subHours(6)); // Вернитесь в настоящее время... $this->travelBack();}
Улучшения Artisan serve
Улучшения Artisan serve
были предоставлены Taylor Otwell.
Команда Artisan serve
была улучшена за счет автоматической перезагрузки при обнаружении изменений переменных среды в Вашем локальном файле .env
. Раньше команду приходилось останавливать и перезапускать вручную.
Пагинация представлений Tailwind
Пагинатор Laravel был обновлен для использования по умолчанию фреймворка Tailwind CSS. Tailwind CSS - это настраиваемая низкоуровневая CSS-структура, которая дает Вам все строительные блоки, необходимые для создания нестандартных дизайнов без каких-либо раздражающих самоуверенных стилей, за которые Вам придется бороться. Конечно, также остаются доступными представления Bootstrap 3 и 4.
Обновления пространства имен маршрутизации
В предыдущих выпусках Laravel RouteServiceProvider
содержал свойство $namespace
. Значение этого свойства будет автоматически добавлено к определениям маршрута контроллера и вызовам вспомогательного метода action
/ URL::action
. В Laravel 8.x это свойство по умолчанию имеет значение null
. Это означает, что Laravel не будет выполнять автоматическое префиксы пространства имен. Следовательно, в новых приложениях Laravel 8.x определения маршрутов контроллера должны быть определены с использованием стандартного синтаксиса вызываемого PHP:
use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']);
Вызовы action
методов, связанных с действием, должны использовать один и тот же вызываемый синтаксис:
action([UserController::class, 'index']); return Redirect::action([UserController::class, 'index']);
Если Вы предпочитаете префикс маршрута контроллера в стиле Laravel 7.x, Вы можете просто добавить свойство $namespace
в RouteServiceProvider
Вашего приложения.
{note} Это изменение касается только новых приложений Laravel 8.x. Приложения, обновляющиеся с Laravel 7.x, по-прежнему будут иметь свойство
$namespace
в ихRouteServiceProvider
.