Создание своих директив
Цель создания собственных директив:
- Чтобы не загружать шаблон логическими конструкциями
- Чтобы избежать дублирования кода
Например, в личном кабинете у администратора сайта должны быть кнопки редактирования и удаления, у обычного пользователя сайта таких кнопок быть не должно. Сперва надо проверить, что пользователь аутентифицирован, а потом — что он является администратором.
Директивы создаются в методе boot()
класса AppServiceProvider
и определяются следующим образом:
app/Providers/AppServiceProvider.phpnamespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
class AppServiceProvider extends ServiceProvider {
public function register() {
// ...
}
public function boot() {
Blade::directive('some_name', function($expression) {
// какой-то код
return $something;
});
}
}
Директива Иконка
Если на сайте используются иконки Font Awesome, то в шаблонах много кода типа:
<i class="fas fa-shopping-basket"></i> <!-- корзина покупателя -->
<i class="fas fa-arrow-circle-right"></i> <!-- стрелка вправо -->
<i class="fas fa-download"></i> <!-- скачать файл -->
Давайте создадим директиву @icon()
, чтобы вставлять иконки по имени:
class AppServiceProvider extends ServiceProvider {
public function boot() {
Blade::directive('icon', function($expression) {
$name = str_replace("'", '', $expression);
return '<i class="fas fa-' . $name . '"></i>';
});
}
}
Теперь можем вставлять иконки с использованием новой директивы:
<p>Цена: {{ number_format($product->price, 2, '.', '') }}</p>
<!-- Форма для добавления товара в корзину -->
<form action="{{ route('basket.add', ['id' => $product->id]) }}" method="post">
@csrf
<button type="submit" class="btn btn-success">
@icon('shopping-basket') Добавить в корзину
</button>
</form>
Директива Цена
В примере выше используется функция number_format()
для форматирования цены. Давайте создадим директиву @price()
:
class AppServiceProvider extends ServiceProvider {
public function boot() {
Blade::directive('icon', function($expression) {
$name = str_replace("'", '', $expression);
return '<i class="fas fa-' . $name . '"></i>';
});
Blade::directive('price', function($expression) {
return "<?php echo number_format($expression, 2, '.', ''); ?>";
});
}
}
Теперь можно форматировать цену с использованием новой директивы:
<p>Цена: @price($product->price)</p>
<!-- Форма для добавления товара в корзину -->
<form action="{{ route('basket.add', ['id' => $product->id]) }}" method="post">
@csrf
<button type="submit" class="btn btn-success">
@icon('shopping-basket') Добавить в корзину
</button>
</form>
Директива Админ
Директива @admin
, которая проверяет, что пользователь аутентифицирован и является администратором:
class AppServiceProvider extends ServiceProvider {
public function boot() {
Blade::directive('icon', function($expression) {
$name = str_replace("'", '', $expression);
return '<i class="fas fa-' . $name . '"></i>';
});
Blade::directive('price', function($expression) {
return "<?php echo number_format($expression, 2, '.', ''); ?>";
});
Blade::if('admin', function() {
return auth()->check() && auth()->user()->admin;
});
}
}
@admin
<p>Это администратор сайта</p>
@else
<p>Это обычный пользователь</p>
@endadmin