
Laravel 5.5 LTS обзор нового релиза
Совсем недавно вышел новый релиз Laravel под номером 5.5, новая версия LTS (long term support). Она включает исправления по багам за 2 года, исправления безопасности за 3 года и новые фичи, речь о которых и пойдет в данной статье.
Whoops пакет
Whoops пакет вернулся в Laravel 5.5, теперь стек трейс выглядит так же привлекательно как и в 4-той версии.
Дампинг коллекций
Теперь дебажить коллекции стало намного проще с фунциями dump и dd.
Например, dump, выводит результат:
1 2 3 4 5 |
collect([1,2,3])->map(function($i){ return $i * 2; })->dump()->reject(function($i){ return $i < 3; }); |
Результат:
1 2 3 4 5 |
array:3 [▼ 0 => 2 1 => 4 2 => 6 ] |
В то же время dd (dd — dump and die) выводит тот же результат и останавливает цепочку:
1 2 3 4 5 |
collect([1,2,3])->map(function($i){ return $i * 2; })->dd()->reject(function($i){ return $i < 3; }); |
Результат тот жe:
1 2 3 4 5 |
array:3 [▼ 0 => 2 1 => 4 2 => 6 ] |
Отображение исключений
В новом релизе, вы можете прорисовывать исключения путем определения нового метода render в классе исключения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php namespace App\Exceptions; use App\Song; class TerribleSongException extends \Exception { /** * @var \App\Song */ protected $song; public function __construct(Song $song) { $this->song = $song; } /** * @param \Illuminate\Http\Request $request */ public function render($request) { return response("The song '{$this->song->title}' by '{$this->song->artist}' is terrible."); } } |
Теперь, просто, сделав throw new TerribleSongException(), Laravel сам отправит респонс. Также, можно, просто имплементировать Responsable интерфейс (контракт) для класса исключения. А что из себя представляет Responsable интерфейс, речь пойдет ниже.
Responsable интерфейс
Теперь перед созданием респонс объекта проверяется на Responsable интерфейс. Класс который имплементирует интерфейс может быть возвращен с контроллера:
1 2 3 4 5 6 7 8 |
public function store(Request $request) { $song = new Song($data); $song->save(); return new NewSongResponse($song); } |
Сам класс может выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php namespace App\Http\Responses; use App\Song; use Illuminate\Contracts\Support\Responsable; class NewSongResponse implements Responsable { /** * @var \App\Song */ protected $song; /** * @param \App\Song $song */ public function __construct(Song $song) { $this->song = $song; } public function toResponse($request) { if ($request->wantsJson()) { return response() ->json($this->song) ->header('Location', route('songs.show', $this->song)) ->setStatusCode(201); } return redirect() ->route('songs.show', $this->song); } } |
Валидация запроса
В более поздних версиях Laravel для валидации запроса использовался метод validate с контроллера:
1 2 3 4 5 6 |
<?php $this->validate(request(), [ 'name' => 'required', 'age' => 'required|numeric', ]); |
Сейчас же появился более удобный вызов с самого объекта запроса:
1 2 3 4 5 6 |
<?php $data = request()->validate([ 'name' => 'required', 'age' => 'required|numeric'<strong>,</strong> ]); |
На выходе получаем массив ($data) — аналог вызову Request::only():
1 2 3 4 5 6 |
<?php [ 'name' => 'Alex', 'age' => '21', ]; |
Кастомные валидационные объекты и замыкания
Начиная с версии 5.5 кроме возможности создания кастомных методов валидации Validator::extend появилась возможность писать валидаторы имплементируя Rule интерфейc.
Для генерации валидатора, вызываем artisan:
1 |
$ php artisan make:rule AgeValidationRule |
Получаем класс в котором нужно описать два метода, passes и message:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!-- app/Rules/AgeValidationRule.php --> <?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class AgeValidationRule implements Rule { public function passes($attribute, $value) { return $value >= 18; } public function message() { return 'The User is under the age of 18'; } } |
Использовать класс можно следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php request()->validate([ 'age' => [new AgeValidationRule] ]); Для валидации также можно использовать замыкание в следующей форме: <?php request()->validate([ 'age' => [function ($attribute, $value, $fail) { if ($value <= 18) { $fail( 'The User is under the age of 18'); } }] ]); |
Новые директивы @auth и @guest
Раньше мы писали о директиве Blade::if версии 5.5. В новой версии 5.5 появились две новые директивы: @auth и @guest которые вы можете использовать в файлах шаблонов.
В предыдущих версиях вы могли использовать такие варианты проверки аутентификации пользователя:
1 2 3 4 5 |
@if (auth()->check()) {{-- authenticated --}} @endif @if (auth()->guest()) |
Сейчас вы можете использовать эти директивы в более упрощенном виде:
1 2 3 4 5 6 7 |
@auth() Welcome {{ user()->name }} @endauth @guest Welcome Guest! @endguest |
Пресеты для фронтенда
Пресеты — это предустановки для фроненд-фреймворков которые можно сгенерировать при помощи новой команды в artisan. Когда вы начинаете новый проект на Laravel 5.5, у вас уже по-умолчанию установлен фреймворк Vue2.js.
В новой версии Laravel 5.5 вы можете выбрать 4 предустановленных варианта для генерации фронтенда: “none”, “bootstrap”, “vue”, “react”:
Набираем в командной строке с установленным проектом:
php artisan help preset
Использование:
preset <type>
Аргументы type типы пресетов (none, bootstrap, vue, react)
1 2 3 4 5 |
# Использовать react $ php artisan preset react # Удалить все фреймворки $ php artisan preset none |
Factory файлы
Теперь для каждой модели можно делать отдельную фабрику с помощью команды:
1 |
php artisan make:factory --model=User UserFactory |
Или при генерировании модели добавить новый ключ:
1 |
php artisan make:model -fm User |
Если же использовать ключ all, то получим модель, миграцию и фабрику:
1 |
php artisan make:model --all |
Миграция с migrate:fresh
При работе с миграциями в Laravel есть migrate:refresh команда, которая откатывает миграцию назад. В новой версии 5.5 была добавлена команда migrate:fresh которая попросту удаляет все таблицы базы данных и запускает миграцию.
RefreshDatabase Trait
Появился новый трейт для миграции базы данных для тестирования. Этот новый trait использует наиболее оптимальный подход к переносу тестовой базы данных в зависимости от того, используете ли вы in-memory базу данных или традиционную базу данных. Можно обойтись и старыми DatabaseTransactions и DatabaseMigrations не используя RefreshDatabase.
Новый withoutExceptionHandling() метод
Теперь тесты наследуют withoutExceptionHandling метод, который позволяет отключать обработку исключений в коде, для того чтобы отработать его в assert-е теста.
Автоопределение пакетов в Laravel
Для подключения и активации пакета, теперь достаточно просто запустить композер:
composer require barryvdh/laravel-debugbar:dev-master
Больше ничего делать ненужно!
Также можно включить пакет только в дев среду, исполнив:
1 |
composer require-dev barryvdh/laravel-debugbar:dev-master |
Вместо выводов
Как видно, Laravel продолжает радовать своих фанов вкусными ништячками. Еще больше нововведений ждем в версии 5.6.