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

image
Сьогодні відбувся вхід новій версії 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

це буде Виглядати так:
image
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 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.