Примечания к выпуску Laravel 8.x
- Схема контроля версий
- Политика поддержки
- Laravel 8
- Laravel Jetstream
- Собственный каталог для Моделей
- Классы Model Factory
- Сжатие миграций
- Пакетирование заданий
- Улучшенное ограничение скорости
- Улучшенный режим обслуживания
- Прерывание Dispatch / Chain
catch
- Динамические компоненты Blade
- Улучшения прослушивателя событий
- Помощники тестов по времени
- Улучшения Artisan
serve
- Виды Tailwind пагинации
- Обновления пространства имен маршрутизации
Схема контроля версий
Laravel и другие его собственные пакеты следуют практике Семантического управления версиями. Основные выпуски фреймворка выпускаются каждые шесть месяцев (~ март и ~ сентябрь), в то время как второстепенные релизы и патчи могут выпускаться каждую неделю. Незначительные релизы и патчи никогда не должны содержать критических изменений.
Поскольку основные выпуски Laravel действительно включают критические изменения, при ссылке на фреймворк Laravel или его компоненты из вашего приложения или пакета вы всегда должны использовать ограничение версии как ^8.0
. Однако мы всегда стремимся к тому, чтобы вы могли выполнить обновление до новой основной версии не больше, чем в течение одного дня.
Политика поддержки
Для выпусков LTS, таких как Laravel 6, исправления ошибок предоставляются на 2 года, а исправления безопасности - на 3 года. Эти выпуски обеспечивают самый продолжительный период поддержки и обслуживания. Для общих выпусков исправления ошибок предоставляются на 7 месяцев, а исправления безопасности - на 1 год. Для всех дополнительных библиотек, включая Lumen, только последний выпуск получает исправления ошибок. Кроме того, просмотрите версии баз данных, поддерживаемые Laravel.
Версия Laravel | Дата релиза | Исправления ошибок до | Исправления безопасности до |
6 (LTS) | 3.09.2019 | 5.10.2021 | 3.09.2022 |
7 | 3.03.2020 | 6.10.2020 | 3.03.2021 |
8 | 8.09.2020 | 6.04.2021 | 8.09.2021 |
Laravel 8
Laravel 8 продолжает улучшения, сделанные в Laravel 7.x, представляя Laravel Jetstream, Классы Model Factory, сжатие миграций, пакетирование заданий, улучшенное ограничение скорости, улучшения очереди, динамические компоненты Blade, представления пагинации Tailwind, помощники для тестирования времени, улучшения artisan serve
, улучшения прослушивателя событий, а также множество других исправлений ошибок и улучшений удобства использования.
Laravel Jetstream
Laravel Jetstream был написан Тейлором Отвеллом.
Laravel Jetstream - это красиво оформленный каркас приложений для Laravel. Jetstream обеспечивает идеальную отправную точку для вашего следующего проекта и включает в себя вход в систему, регистрацию, проверку электронной почты, двухфакторную аутентификацию, управление сеансом, поддержку API через Laravel Sanctum и дополнительное управление по созданию и поддержке групп пользователей. Laravel Jetstream заменяет и улучшает устаревшую структуру пользовательского интерфейса аутентификации, доступную для предыдущих версий Laravel.
Jetstream разработан с использованием Tailwind CSS и предлагает на ваш выбор компоненты Livewire или Inertia.
Собственный каталог для Моделей
По многочисленным просьбам сообщества скелет приложения Laravel по умолчанию теперь содержит каталог app/Models
. Надеемся, вам понравится это новое место хранения для ваших красивых Моделей! Все соответствующие команды генератора были обновлены с учётом того, что Модели сейчас располагаются в каталоге app/Models
, если он существует. Если каталог не существует, фреймворк предполагает, что ваши Модели должны быть помещены в каталог app
.
Классы Model Factory
Классы Model Factory были написан Тейлором Отвеллом.
Классы Model Factory были полностью переписаны как фабрики на основе классов и улучшены для обеспечения наилучшей поддержки отношений. Например, UserFactory
, включенный в Laravel, написан так:
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
/**
* Название соответствующей Factory модели.
*
* @var string
*/
protected $model = User::class;
/**
* Определите состояние модели по умолчанию.
*
* @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
, доступному для сгенерированных моделей, Model Factory может использоваться следующим образом:
use App\Models\User;
User::factory()->count(50)->create();
Поскольку Model Factory теперь являются простыми классами PHP, преобразования состояний могут быть записаны как методы класса. Кроме того, при необходимости вы можете добавить любые другие вспомогательные классы в Eloquent Model Factory.
Например, ваша модель User
может иметь suspended
состояние, которое изменяет одно из значений ее атрибутов по умолчанию. Вы можете определить свои преобразования состояния, используя метод состояния базовой фабрики. Вы можете называть свой метод state
как угодно. В конце концов, это просто типичный PHP-метод:
/**
* Укажите, что пользователь заблокирован.
*
* @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();
Как уже упоминалось, Model Factory в Laravel 8 содержат первоклассную поддержку отношений. Итак, предполагая, что наша модель User
имеет метод взаимосвязи posts
, мы можем просто запустить следующий код для создания пользователя с тремя сообщениями:
$users = User::factory()
->hasPosts(3, [
'published' => false,
])
->create();
Чтобы упростить процесс обновления, был выпущен пакет laravel/legacy-factoryies, обеспечивающий поддержку предыдущей версии Model Factory в Laravel 8.x.
Переписанные фабрики Laravel содержат гораздо больше функций, которые, как мы думаем, вам понравятся. Чтобы узнать больше о Model Factory в Laravel 8.x, обратитесь к документации по тестированию баз данных.
Сжатие миграций
Сжатие миграций были написан Тейлором Отвеллом.
По мере создания приложения вы можете со временем накапливать все больше и больше миграций. Это может привести к тому, что ваш каталог миграции станет раздутым за счет возможно сотен миграций. Если вы используете MySQL или PostgreSQL, теперь вы можете «сжать» свои миграции в один файл SQL. Для начала выполните команду schema:dump
:
php artisan schema:dump
// Выгрузите текущую схему базы данных и удалите все существующие миграции ...
php artisan schema:dump --prune
Когда вы выполняете эту команду, Laravel запишет файл "схемы" в ваш каталог database/schema
. Теперь, когда вы попытаетесь перенести свою базу данных, и никакие другие миграции не выполнялись, Laravel сначала выполнит SQL команды из этого файла схемы. После выполнения команд файла схемы Laravel выполнит все оставшиеся миграции, которые не были частью созданного дампа схемы.
Пакетирование заданий
Пакетирование заданий были написан Тейлором Отвеллом и Мохамедом Саидом.
Функция пакетной обработки заданий 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;
Чтобы узнать больше о пакетировании заданий, обратитесь к документации по очереди.
Улучшенное ограничение скорости
Ограничение скорости были написаны Тейлором Отвеллом.
Функция ограничителя скорости запросов Laravel была расширена за счет большей гибкости и мощности, при этом сохранялась обратная совместимость с предыдущими выпусками API middleware throttle
.
Ограничители скорости определяются с помощью метода for
фасада RateLimiter
. Метод for
принимает имя ограничителя скорости и Closure, которое возвращает конфигурацию ограничения, которая должна применяться к маршрутам, которым назначен этот ограничитель скорости:
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. throttle
middleware принимает имя ограничителя скорости, которое вы хотите назначить маршруту:
Route::middleware(['throttle:uploads'])->group(function () {
Route::post('/audio', function () {
//
});
Route::post('/video', function () {
//
});
});
Чтобы узнать больше об ограничении скорости, обратитесь к документации по маршрутизации.
Улучшенный режим обслуживания
Улучшенный режим обслуживания был написан Тейлором Отвеллом с вдохновением от Spatie.
В предыдущих выпусках Laravel функцию режима обслуживания php artisan down
можно было обойти с помощью «разрешенного списка» IP-адресов, которым был разрешен доступ к приложению. Эта функция была удалена в пользу более простого решения "secret" / token.
Находясь в режиме обслуживания, вы можете использовать опцию secret
, чтобы указать token обхода режима обслуживания:
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"
Прерывание Dispatch / Chain catch
Улучшения Catch были внесены Мохамедом Саидом.
Используя новый метод catch
, теперь вы можете предоставить Closure, которое должно выполняться, если Closure в очереди не может быть успешно завершено после исчерпания всех настроенных попыток повторения вашей очереди:
use Throwable;
dispatch(function () use ($podcast) {
$podcast->publish();
})->catch(function (Throwable $e) {
// Что-то пошло не так...
});
Динамические компоненты Blade
Динамические компоненты Blade были написаны Тейлором Отвеллом.
Иногда вам может потребоваться визуализировать компонент, но вы не знаете, какой компонент следует визуализировать, до времени его выполнения. В этой ситуации теперь вы можете использовать встроенный dynamic-component
компонент Laravel для визуализации компонента на основе значения или переменной:
<x-dynamic-component :component="$componentName" class="mt-4" />
Чтобы узнать больше о компонентах Blade, обратитесь к документации Blade.
Улучшения прослушивателя событий
Улучшения прослушивателя событий были написаны Тейлором Отвеллом.
Слушатели событий на основе Closure теперь могут быть зарегистрированы только путем передачи Closure методу Event::listen
. Laravel проверит Closure, чтобы определить, какой тип события обрабатывает слушатель:
use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;
Event::listen(function (PodcastProcessed $event) {
//
});
Кроме того, прослушиватели событий на основе Closure теперь могут быть помечены как стоящие в очереди с помощью функции 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)));
Если вы хотите обрабатывать сбои анонимного прослушивателя в очереди, вы можете предоставить Closure для метода 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) {
// Сбой прослушивателя в очереди...
}));
Помощники тестов по времени
Помощники по тестированию времени были предоставлены Тейлором Отвеллом с вдохновением от 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
были написаны Тейлором Отвеллом.
В команду Artisan serve
была добавлена автоматическая перезагрузка при обнаружении изменений переменных среды в локальном файле .env
. Раньше команду приходилось останавливать и перезапускать вручную.
Виды Tailwind пагинации
Пагинатор Laravel был обновлен для использования по умолчанию CSS-фреймворка Tailwind. 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
вашего приложения.
Это изменение касается только новых приложений Laravel 8.x. Приложения, обновляющиеся с Laravel 7.x, по-прежнему будут иметь свойство
$namespace
в своемRouteServiceProvider
.
Перевод официальной документации:
https://laravel.com/docs/8.x/releases
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)