
Як створити Blade-директиви в Laravel 5
12.04.2018 11:19 | Laravel
З якою метою створюються власні директиви? Відповідь проста: по-перше, щоб не перевантажувати шаблом логічними конструкціями (коли без них не обійтись), по-друге, щоб уникнути повторення коду. Наведу конкретні приклади.
- На фронтенді в шаблоні адміну сайта треба показувати деякі кнопки (редагування, видалення), відповідно, треба перевіряти, чи є користувач адміном.
- У базі даних грошові суми зберігаються в центах (тобто
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’)
може бути цілком виправданим. Та зловживати директивами теж не слід. Головне – доцільність застосування та читабельний і зрозумілий код.