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