Создание пользовательских директив Blade в Laravel
Laravel Blade
потрясающий, действительно потрясающий. Одна из замечательных особенностей — это возможность добавлять собственные директивы.
Один из вариантов использования, с которым я недавно наткнулся, — это форматирование денег с помощью валюты. Конечно, я могу создать вспомогательную функцию и вызвать ее.
Пример:
if (! function_exists('formatMoney')) {
function formatMoney(string|int|float $amount) {
if (is_string($amount)) {
$amount = floatval($amount);
}
$settings = app(GeneralSettings::class);
$formatter = new NumberFormatter(config('app.currency_locale', 'en_US'), NumberFormatter::CURRENCY);
return $formatter->formatCurrency($amount, $settings->app_currency);
}
И тогда мы могли бы использовать его в наших представлениях, как показано ниже.
...
{{ formatMoney($invoice->total) }}
...
И мы готовы идти дальше, но в этом контексте давайте воспользуемся силой Blade
и создадим нашу собственную директиву.
Для этого откройте AppServiceProvider.php
и перейдите к методу загрузки.
Внутри метода загрузки мы напишем собственную директиву.
Blade::directive($name, function ($expression) {
some code here;
});
В нашем контексте мы будем использовать приведенный выше код, определенный во вспомогательном классе, чтобы можно было форматировать деньги.
Директива Blade
будет называться Money
Blade::directive('money', function ($expression) {
return "<?php echo app('App\Utils\Helpers')->formatMoney($expression); ?>";
});
Итак, вот окончательный код, и в файле представления мы можем вызвать его следующим образом:
@money('somevalue')
Суть здесь в возвращаемом значении: если вы хотите иметь какие-то средства форматирования или какие-то условия, возвращаемое значение должно быть PHP-кодом. Давайте возьмем другой пример.
В Laravel
есть директивы @auth
и @guest
.
Но давайте что-нибудь сделаем сами. Допустим, в нашем приложении есть клиенты, поэтому мы создадим блейд-директиву, которая проверяет, является ли аутентифицированный пользователь клиентом или нет, и покажем некоторый код на основе этого условия.
Обычно мы делаем следующее:
@if(auth()->user()->isCustomer)
//some code here
@endif
Но это было бы сложно, если бы этот фрагмент кода был повсюду в наших представлениях. Представьте, что мы добавим еще одно условие, например, проверку наличия у клиента активной подписки.
Так что да, вы поняли суть.
В этой ситуации мы могли бы использовать пользовательские директивы блейда.
Использование новой директивы будет следующим:
@customer
//somecode here
@endcustomer
Как вы можете видеть здесь, у нас есть две директивы, поэтому мы определим две функции в нашем AppServiceProvider.php
.
Blade::directive('customer', function ($expression) {
return "<?php if(auth()->check() && auth()->user()->isCustomer): ?>";
});
Blade::directive('endcustomer', function ($expression) {
return "<?php endif; ?>";
});
Первый — проверить условие и открыть двоеточие для логики вашего кода, а второй — закрыть оператор if
.
В этом коротком уроке мы увидели, как можно писать собственные директивы блейда. Надеюсь, вам было полезно понять, как их создавать и использовать.