Короткий огляд нововведень в Laravel 5.4

Сьогодні відбувся вхід новій версії PHP-фреймворку Laravel — 5.4!
У новій версії були додані такі можливості, як підтримка Markdown-розмітки для формування електронних листів і повідомлень, покращена підтримка Redis, додані нові можливості шаблонизатора Blade і безліч інших. Але про все по порядку.
Markdown-розмітка для електронних листів і повідомлень
З підтримкою Markdown, Laravel тепер може генерувати гарні і адаптивні HTML шаблони для електронних листів, а також генерує звичайну текстову версію. Наприклад, тепер Ваш код для генерування листа може виглядати так:
@component('mail::message')
# Order Shipped
Your order has been shipped!
@component('mail::button', ['url' => $url])
View Order
@endcomponent
Next Steps:
- Track Your Order On Our Website
- Pre-Sign For Delivery
Thanks,<br>
{{ config('app.name') }}
@endcomponent
це буде Виглядати так:

Laravel Сутінки
Laravel Сутінки — це нова утиліта для end-to-end тестування додатків. За замовчуванням, для її використання не потрібно установка JDK або Selenium. Замість них, Сутінки використовує standalone версію ChromeDrive, але ви також можете використовувати будь-який інший драйвер, совместивый з Selenium.
Оскільки Сутінки використовує реальний браузер для тестування, Ви можете з легкістю тестувати і взаємодіяти з додатками, в яких використовується JavaScript:
/**
* A basic browser test example.
*
* @return void
*/
public function testBasicExample()
{
$user = factory(User::class)->create([
'email' => 'taylor@laravel.com',
]);
$this->browse(function ($browser) use ($user) {
$browser->loginAs($user)
->visit('/home')
->press('Create Playlist')
->whenAvailable('.playlist-modal', function ($modal) {
$modal->type('name', 'My Playlist')
->press('Create');
});
$browser->waitForText('Playlist Created');
});
}
Компоненти і слоти для Blade шаблонизатора
Використання нових функцій шаблонизатора Blade — компонентів і слотів — дозволяє робити все те, що ви звикли робити з секціями і шаблонами. Однак, для деяких розробників модель компонент-слот може здатися набагато легше для розуміння. Для початку, уявімо, що у нас є компонент "alert", який ми хочемо використовувати в нашому додатку у всіх шаблонах:
<!-- /resources/views/alert.blade.php -->
<div class="alert alert-danger">
{{ $slot }}
</div>
Мінлива
{{ $slot }}
міститиме той контент, який ми захочемо передати в компонент. Щоб оголосити цей компонент, ми використовуємо нову дериктиву @component
:@component('alert')
<strong>Whoops!</strong> Something went wrong!
@endcomponent
Именованыне слоти дозволяють використовувати кілька слотів в одному компоненті:
<!-- /resources/views/alert.blade.php -->
<div class="alert alert-danger">
<div class="alert-title">{{ $title }}</div>
{{ $slot }}
</div>
Вони передаються в компонент з використанням директиви
@slot
. Будь-який контент поза це директиви буде переданий в компонент в якості змінної $slot
:@component('alert')
@slot('title')
Forbidden
@endslot
You are not allowed to access this resource!
@endcomponent
Broadcast Model Binding
так Само як і HTTP роуты, роуты для каналів прослушки подій тепер також можуть використовувати неявную прив'язку до моделі. Наприклад, замість рядка або числового ID, ви можете передати примірник моделі (класу) Order:
use App\Order;
Broadcast::channel('order.{order}', function ($user, Order $order) {
return $user->id === $order->user_id;
});
Повідомлення вищого порядку в колекціях (Higher order messages, HOM)
Колекція тепер підтримують повідомлення вищого порядку, які дозволяють виробляти спільні операції з колекціями. Зараз доступні наступні повідомлення:
- contains
- each
- every
- filter
- first
- map
- partition
- reject
- sortBy
- sortByDesc
- sum
each
, щоб застосувати який-небудь метод до кожного об'єкту всередині колекції:$users = User::where'votes', '>', 500)->get();
$users->each->markAsVip();
Аналогічним чином, Ви можете використовувати
sum
, щоб, приміром, порахувати кількість голосів в колекції з користувачами:$users = User::where'group', 'Development')->get();
return $users->sum->votes;
Користувальницькі обробники подій Eloquent
Обробники подій в Eloquent тепер можуть бути прив'язані до об'єктів подій. Це дозволяє набагато простіше обробляти події Eloquent, а також спрощує тестування цих подій. Щоб використати це нововведення, необхідно оголосити властивість
$events
в класі Вашої моделі, що дозволить використовувати Ваші власні класи для обробки базових подій Eloquent:<?php
namespace App;
use App\Events\UserSaved;
use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The event map for the model.
*
* @var array
*/
protected $events = [
'saved' => UserSaved::class,
'deleted' => UserDeleted::class,
];
}
Retry & Timeout для кожного процесу
Раніше, налаштування "retry" і "timeout" встановлювалися глобально для всіх процесів командного рядка. У Laravel 5.4, ці настройки тепер можна задавати для кожного процесу в індивідуальному порядку, визначивши їх безпосередньо в класі процесу:
<?php
namespace App\Jobs;
class ProcessPodcast implements ShouldQueue
{
/**
* The number of times the job may be attempted.
*
* @var int
*/
public $tries = 5;
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout = 120;
}
Middleware для очищення запитів
У Laravel 5.4 з'явилися два нових middleware'a (фільтра запитів):
TrimStrings
та ConvertEmptyStringsToNull
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
Ці два фільтра автоматично прибирають пробіли на початку і в кінці значень, а також конвертують порожні рядки
null
, що дозволяє нормалізувати дані кожного запиту і забути про постійне використання функції trim
у Вашому коді."Realtime" Фасади
Раніше, тільки що поставляються за замовчуванням Laravel сервіси надавали фасади, які дозволяли швидко і лаконічно використовувати свої методи через сервіс-контейнер. У Laravel 5.4 з'явилася можливість легко конвертувати будь-клас у фасад в реальному часі. Уявімо, що у нас є наступний клас:
<?php
namespace App\Services;
class PaymentGateway
{
protected $tax;
/**
* Create a new payment gateway instance.
*
* @param TaxCalculator $tax
* @return void
*/
public function __construct(TaxCalculator $tax)
{
$this->tax = $tax;
}
/**
* Pay the given amount.
*
* @param int $amount
* @return void
*/
public function pay($amount)
{
// Pay an amount...
}
}
Щоб зробити його фасадом, достатньо лише додати префікс Facades:
use Facades\ {
App\Services\PaymentGateway
};
Route::get('/pay/{amount}', function ($amount) {
PaymentGateway::pay($amount);
});
Ви також можете писати тести взаимодействи з використанням функції імітування фасадів:
PaymentGateway::shouldReceive('pay')->with('100');
Користувальницькі моделі для сполучних таблиць
У Laravel 5.3 всі моделі "сполучних" таблиць для зв'язків "many-to-many" використовували один і той же примірник вбудованої моделі
Pivot
. У Laravel 5.4 ви можете визначити свою модель для зведеної таблиці після оголошення зв'язку наступним чином:<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role Model extends
{
/**
* The users that belong to the role.
*/
public function users()
{
return $this->belongsToMany('App\User')->using('App\UserRole');
}
}
Покращена підтримка кластерів Redis
Раніше не було можливість визначити з'єднання Redis до одного хосту і кластерів в одному додатку. З Laravel 5.4 Ви можете визначити кілька підключень до хостам і кластерів. Більш докладно документації до Redis.
Довжина рядків за замовчуванням в міграціях
У Laravel 5.4 використовується utf8mb4 як кодування за замовчуванням, яка підтримує зберігання emoji в базі даних. Якщо ви оновлюйтеся з Laravel 5.3, вам не потрібно змінювати кодування.
Якщо Ви все ж її змінюєте вручну чи використовуєте MySQL версії молодше 5.7.7, вам необхідно вручну настроїти довжину рядків за замовчуванням, які генирируют міграції, за допомогою методу
Schema::defaultStringLength
у вашому AppServiceProvider
:use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
Джерело: Хабрахабр
0 коментарів