Что нового в Laravel 8.0

Что нового в Laravel 8.0

релиз 8 версии laravel

Laravel 8 будет включать в себя несколько приятных новых дополнений, включая улучшенный режим обслуживания, а также еще несколько более крупных функций, которые еще не были объявлены

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

Начиная с Laravel 6, фреймворк перешел на семантическое управление версиями и следует назначенному процессу выпуска. Это означает, что каждые 6 месяцев выпускается новый выпуск с первым номером (6.0, 7.0, 8.0 и т.д.), а между ними - выпуски исправлений.

Возможность тестирования views и компоненты Blade по отдельности ( #31378 и #32601 )

  • Классы Collection, Arr и Macroable получат свой собственный пакет ( #32478 , #32481 , #32510 и #33108 )
  • Команда дампа схемы - php artisan schema:dump ( #32275 )
  • Поддержка каталога Eloquent Model - app/Models ( #33390 )
  • Улучшенный режим обслуживания (шаблоны, список разрешений, редиректы и код состояния, #33560 )
  • Больше не перезапускать встроенный веб-сервер при обновлении .env ( твит )
  • Улучшение компонентов Blade, правильное наследование родительских атрибутов ( #32576 )
  • Улучшения метода dispatchNow ( #32559 )
  • Заполнение базы данных после обновления ( #32485 )
  • Разрешить кастомные ссылки для сброса пароля через обратный вызов ( #33438 )
  • Улучшения ограничения скорости ( #32726 )
  • Кэшировать маршруты с замыканием ( твит )
  • Поддержка необработанного HTML в компонентах Blade ( #33365 )
  • Улучшения в именовании конфигураций очередей ( #32728 и #32809 )
  • Поддержка замыканий в методе Eloquen with() ( #32924 )
  • Удаление свойства $dates у моделей Eloquent ( #32856 - отменено )
  • Поддержка пакетной обработки заданий ( #32830 , #33173 , #32974 и #32967 )
  • Поддержка вызова firstOrNew/firstOrCreate без параметров ( #33334 )
  • Поддержка замыканий в слушателях очередей ( #33463 )
  • Обработка сбоев заданий замыканий очереди ( твит )

Laravel Jetstream

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

Папка Models

Скелет приложения Laravel 8 включает папку app/Models. Все команды генератора предполагают, что модели существуют в app/Models; однако, если этот каталог не существует, структура будет считать, что приложение хранит модели в app/.

Классы фабрики моделей

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


use App\Models\User;

User::factory()->count(50)->create();

// using a model state "suspended" defined within the factory class
User::factory()->count(5)->suspended()->create();

Сжатие миграции

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

Улучшенное ограничение скорости

Laravel 8 вносит улучшения в существующие функции ограничения скорости, поддерживая обратную совместимость с существующим throttle middleware и предлагая гораздо большую гибкость. В Laravel 8 есть концепция ограничителей скорости, которые вы можете определить через фасад:


use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000);
});

Как видите метод for() принимает экземпляр HTTP-запроса, что дает вам полный контроль над динамическим ограничением запросов.

Помощники по тестированию времени

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


// Travel into the future...
$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();

// Travel into the past...
$this->travel(-5)->hours();

// Travel to an exact time...
$this->travelTo(now()->subHours(6));

// Return back to the present time...
$this->travelBack();

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

Компоненты Dynamic Blade

Иногда вам нужно динамически визуализировать blade-компонент во время выполнения. Laravel 8 предоставляет компонент для рендеринга <x-dynamic-component/>:


<x-dynamic-component :component="$componentName" class="mt-4" />

Пакетирование заданий

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

Новый метод фасада Bus batch() может использоваться для отправки пакета заданий. Конечно, пакетирование в первую очередь полезно в сочетании с обратными вызовами завершения. Таким образом, вы можете использовать методы then, catch и finally  для определения завершения обратного вызова для партии. Каждый из этих обратных вызовов получит экземпляр при вызове: Illuminate\Bus\Batch


use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
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) {
// All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
})->dispatch();

return $batch->id;

Улучшенный режим обслуживания

В предыдущих выпусках Laravel php artisan down функцию режима обслуживания можно было обойти с помощью «разрешенного списка» IP-адресов, которым был разрешен доступ к приложению. Эта функция была удалена в пользу более простого решения «secret»/token.

Находясь в режиме обслуживания, вы можете использовать опцию secret для указания токена обхода режима обслуживания:


php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

После перевода приложения в режим обслуживания вы можете перейти к URL-адресу приложения, соответствующему этому токену, и Laravel выдаст вашему браузеру файл cookie обхода режима обслуживания:


https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

Замыкание Dispatch/Chain

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


use Throwable;

dispatch(function () use ($podcast) {
$podcast->publish();
})->catch(function (Throwable $e) {
// This job has failed...
});

Улучшения прослушивателя событий

Слушатели событий, основанные на замыкании, теперь могут быть зарегистрированы только путем передачи замыкания в метод. Laravel проверит замыкание, чтобы определить, какой тип события обрабатывает слушатель:Event::listen


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...
}));

Улучшение artisan serve

В команду Artisan serve добавлена ​​автоматическая перезагрузка при обнаружении изменений переменных среды в вашем локальном .env файле. Раньше команду приходилось останавливать и перезапускать вручную.

Обновления пространства имен маршрутизации

В предыдущих выпусках Laravel объект RouteServiceProvider содержал свойство $namespace. Значение этого свойства будет автоматически добавляться к определениям маршрута контроллера и вызовам action вспомогательного метода. В Laravel 8.x это свойство по умолчанию. Это означает, что Laravel не будет выполнять автоматический префикс пространства имен. Следовательно, в новых приложениях Laravel 8.x определения маршрутов контроллера должны быть определены с использованием стандартного синтаксиса вызываемого PHP:URL::action null


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.

Сергей Мухин

Веб-разработчик со стажем программирования более 6 лет, постоянно учусь, люблю делать новые проекты.

Есть вопросы?

Я почти всегда в режиме онлайн

Связаться со мной