Разработка сайта

Мы Makklays. Мы помогаем воплотить идею.

Что нового в Laravel 8 ?


Makklays - Статьи image

eye 131

Наступил сентябрь 2020, а вместе с ним и релиз Ларавель 8 (Laravel 8). Не изменив своим традициям, каждые пол года ( начиная с Ларавель 6 ) команда Ларавель выпускает новую версию Laravel c обновлениями и улучшениями. Laravel Non-LTS (общая версия), Laravel 8 будет предоставлять 6-месячные исправления ошибок до 8 марта 2021 года, и 1 год исправлений безопасности - до 8 сентября 2021 года. Итак, давайте посмотрим на все новые улучшения, что нового в Laravel 8

Что нового в Ларавель 8



Laravel 8 имееет несколько новых функций. Функцию butch по группировке заданий, улучшение предыдущих функций, таких как кэширование маршрутов, исправление ошибок. А также, изменение каталога моделей по умолчанию, Schema Dump, Laravel Jetstream, режим обслуживания сайта (maintenance mode), Rate Limit, классы фабрики моделей, сжатие миграции, улучшения, ограничивающие скорость, помощники по тестированию времени, динамические компоненты лезвий и многие другие функции. Давайте рассмотрим Что добавилось и улучшилось в Laravel 8. Выделил самый интересные улучшения.

Laravel Jetstream



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

Папка Models



Папка поделей расположенна теперь в app/Models и соответственно все комманды считают, что файлы моделей расположенны именно в директории app/Models. Но если у вас отсутстввует директория app/Models, модели будут искать в директории app (расположение из предыдущих версий).

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



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

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

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



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

use Throwable;

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


Artisan serve



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

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



В предыдущих выпусках 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.

Bus Batching



Функция групповой обработки заданий 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 ClassFun(Fun::find(1)),
new ClassFun(Fun::find(2)),
new ClassFun(Fun::find(3)),
new ClassFun(Fun::find(4)),
new ClassFun(Fun::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».

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

php artisan down --secret="12345a-321a-3b43-12b1-aab212-1017828"

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

https://ayoursite.com/12345a-321a-3b43-12b1-aab212-1017828

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



Начиная с 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. Этот файл будет выполняться первым при запуске миграции, а затем все оставшиеся файлы миграции, которые не вошли в сжатый файл. Сжатие существующих миграций может уменьшить количество файлов миграции, а также, повысит производительность при выполнении тестов в Ларавель 8.

taylorotwell (разработчик Ларавель) пишет об этом так (перевод):
Этот PR добавляет поддержку новой команды php artisan schema: dump, которая использует mysqldump или pgdump для выгрузки текущего состояния вашей схемы в файл database/schema/{connection}-schema.mysql.

Когда этот файл существует и php artisan migrate или php artisan migrate:fresh запущен И никакие миграции для базы данных еще не выполнялись (таблица миграций пуста), этот файл схемы будет сначала загружен в базу данных, а затем будут запущены все незавершенные миграции. Это означает, что фактически этот файл схемы обычно будет использоваться только во время локальной разработки или во время тестирования CI. В производственной среде у вас, как правило, уже есть миграции, которые выполнялись в прошлом, поэтому этот файл схемы никогда не будет запущен.

После создания файла схемы любые или все существующие миграции могут быть удалены, если они уже выполнялись в вашей производственной среде. Они больше не нужны во время локальной разработки, поскольку файл схемы существует. Для удобства в команду schema: dump был добавлен флаг --prune, чтобы удалить существующие миграции после сброса схемы.

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

Eloquent с with()



Разработчик этой новинки ryancco об этом пишет так:
Обеспечивает поддержку альтернативного, более элегантного синтаксиса для отношений активной загрузки с ограничениями в Ларавель 8.

Чтобы не вносить никаких критических изменений, он по-прежнему поддерживает все возможные в настоящее время вызовы методов:

одиночная строка (->with('foo'))
список строк (->with('foo', 'bar'))
[неассоциативный] массив строк (->with(['foo', 'bar']))
ассоциативный массив строковых ключей и closure значений (->with(['foo' => function () {}]))

Это введет поддержку замыканий в качестве второго аргумента, как показано ниже:

// single relationship
$query->with('foo', function ($query) {
$query->where('status', 'active');
});

// multi relationship
$query->with('foo', function ($query) {
$query->where('status', 'active');
})->with('bar', function ($query) {
$query->where(...);
});

Альтернативным и текущим синтаксисом этого может быть использование ассоциативного массива, как показано ниже:

// single relationship
$query->with([
'foo' => function ($query) {
$query->where('status', 'active');
},
]);

// multi relationship
$query->with([
'foo' => function ($query) {
$query->where('status', 'active');
},
'bar' => function ($query) {
$query->where(...);
}
]);

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

Автор: Александр Кузив