Полный цикл в digital

Создание своих директив

Цель создания собственных директив:

  • Чтобы не загружать шаблон логическими конструкциями
  • Чтобы избежать дублирования кода

Например, в личном кабинете у администратора сайта должны быть кнопки редактирования и удаления, у обычного пользователя сайта таких кнопок быть не должно. Сперва надо проверить, что пользователь аутентифицирован, а потом — что он является администратором.

Директивы создаются в методе 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
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг