Як створити Blade-директиви в Laravel 5

Як створити Blade-директиви в Laravel 5

З якою метою створюються власні директиви? Відповідь проста: по-перше, щоб не перевантажувати шаблом логічними конструкціями (коли без них не обійтись), по-друге, щоб уникнути повторення коду. Наведу конкретні приклади.

  1. На фронтенді в шаблоні адміну сайта треба показувати деякі кнопки (редагування, видалення), відповідно, треба перевіряти, чи є користувач адміном.
  2. У базі даних грошові суми зберігаються в центах (тобто integer), але виводити потрібно double.

Відразу до справи. Директиви створюються у методі boot() класу AppServiceProvider та визначаються наступним чином:

Blade::directive('directive_name', function($expression) {
    # your code
    return $something;
});

 

Розглянемо вищенаведені ситуації. Якщо припустити, що в моделі User прописаний метод isAdmin(), то директива буде виглядати так:

Blade::if('admin', function() {
    return auth()->check() && auth()->user()->isAdmin();
});

Тобто ми перевіряємо, чи аутентифікований користувач і, якщо це так, чи є він адміном. Тепер можна використовувати дану директиву у шаблоні Blade:

@admin
	Yes, the user is an admin
@else
	No, the user isn't an admin
@endadmin

Відмічу, що створена нами конструкція є кастомною if-директивою, які були введені, починаючи з Laravel 5.5.

 

У другому прикладі з форматуванням також нічого складного:

Blade::directive('double', function($expression) {
    return "<?php echo number_format($expression / 100, 2, '.', ' '); ?>";
});

Використання:

@double($product->price) // Якщо ціна дорівнює, наприклад, 169995 центів, на виході отримаємо 1 699.95

Слід зауважити, що для форматування також можна написати відповідний аксесор в моделі, але це окрема тема для розмови.

 

І ще про одне - якось у інтернеті натрапив на такий код:

@fa(‘fa-bars’)

Іншими словами, якщо в проекті часто використовуються іконки Font Awesome, і кожен раз вам ліньки писати щось на зразок:

<i class="fa fa-bars" aria-hidden="true"></i>

додайте в AppServiceProvider відповідну директиву, яка може виглядати приблизно так:

Blade::directive('fa', function($expression) {
    return  '<i class="fa ' . str_replace("'", "", $expression) . '" aria-hidden="true"></i>';
});

Боятися зайвих навантажень не варто, оскільки в документації сказано: «... усі уявлення Blade скомпільовані в чистий PHP-код і кешовані, поки в них немає змін, а це означає, що Blade практично не навантажує ваш додаток». У прикладі вище, використання @fa(‘classname’) може бути цілком виправданим. Та зловживати директивами теж не слід. Головне – доцільність застосування та читабельний і зрозумілий код.