
Как создать директивы 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’)
может быть вполне оправданным. Но, если говорить в общем, то злоупотреблять директивами тоже не следует. Главное – целесообразность применения и читабельный и понятный код.