Улучшение Laravel шаблонов с Blade директивами

Источник: «Boost Your Laravel Templates with Custom Blade Directives»
Узнайте как создавать собственные директивы Blade, для упрощения шаблонов Laravel Blade. В статье рассказывается, что такое директивы Blade, как они используются во фреймворке, и как создать собственную директиву.

Введение

Blade — это мощный шаблонизатор, который вы можете использовать в Laravel. Он позволяет писать чистые шаблоны, используя простой и понятный синтаксис, для создания сложных макетов.

Одна из замечательных функций, которые мне нравятся в Blade, — это возможность создавать собственные директивы. Они позволяют определить собственный синтаксис, который можно использовать в шаблонах Blade, чтобы сделать их более выразительными и удобными для чтения.

В этой статье мы рассмотрим, как создавать собственные директивы Blade в Laravel.

Что такое директивы Blade

Директивы Blade — это удобные маленькие ярлыки/сокращения, которые вы можете добавить в свои шаблоны, чтобы уменьшить потребность в использовании сырого PHP. Они начинаются с символа @, за которым следует директива и любые аргументы.

Если вы использовали Laravel раньше, вы, вероятно, взаимодействовали с директивами Blade, не осознавая этого. Например, вы могли написать оператор if в своём шаблоне Blade, используя директивы @if и @endif следующим образом:

@if($user->isAdmin())
<p>This user is an admin.</p>
@endif

Когда шаблон Blade преобразуется в обычный PHP, он будет выглядеть так:

<?php if($user->isAdmin()): ?>
<p>This user is an admin.</p>
<?php endif; ?>

Как видите, хотя PHP версия не такая элегантная, её всё же довольно легко читать.

Итак, чтобы показать всю сложность, скрываемую Blade от нас, давайте взглянем на ещё одну, казалось бы, простую директиву, в которой довольно много всего происходит за кулисами.

Возможно, вы использовали директивы @foreach и @endforeach для циклического перебора коллекции элементов.

@foreach($users as $user)
<p>{{ $user->name }}</p>
@endforeach

Когда этот шаблон Blade преобразуется в PHP, он будет выглядеть так:

<?php $__currentLoopData = $users; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $user): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<p><?php echo e($user->name); ?></p>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>

Как видите здесь происходит гораздо большее, что Blade прекрасно подчищает для нас.

Laravel поставляется со множеством встроенных директив Blade, с которыми вы можете ознакомиться в документации. Для подавляющего большинства проектов эти директивы, скорее всего, обеспечат всю необходимую функциональность.

Но могут быть случаи, когда вы захотите создать свои собственные директивы Blade. Возможно, вы захотите сделать это, если обнаружите, что снова и снова пишите одни и те же небольшие фрагменты кода. Так что это может быть хорошим способом упростить ваши шаблоны и сделать их более выразительными.

Тем не менее стоит отметить, что если код, который постоянно повторяете, имеет длину больше нескольких строк, возможно стоит рассмотреть возможность переноса его в компонент. Директивы лучше всего подходят для коротких фрагментов кода (возможно, одного или двух операторов PHP).

Создание пользовательских Blade директив

Давайте кратко рассмотрим, как можно написать свою собственную директиву Blade.

Предположим, что мы хотим написать пользовательскую директиву, отображающую объект даты Carbon в определённом, удобном для человека формате. Мы назовём эту директиву @friendlyDateTime.

Прежде чем мы попробуем создать свою директиву Blade, давайте посмотрим, как пишется код для отображения объекта даты Carbon в нужном формате без использования пользовательской директивы. Мы могли бы написать это так:

$carbonObject = \Carbon\Carbon::parse('2023-03-24 14:30:00');

echo $carbonObject->format('D d M Y @ H:i');

Запуск этого кода, выведет следующее:

Fri 24 Mar 2023 @ 14:30

Теперь преобразуем этот код в пользовательскую директиву Blade. Для этого необходимо зарегистрировать директиву в компиляторе Blade. Это можно сделать используя метод Blade::directive в сервис провайдере. Для целей этой статьи мы используем существующий AppServiceProvider, но вы можете добавить этот код к новому сервис провайдеру, если хотите.

Давайте посмотрим на код, в котором мы зарегистрировали директиву:

app/Providers/AppServiceProvider.php:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
// ...
public function boot()
{
Blade::directive('friendlyDateTime', function (string $expression): string {
return "<?php echo ($expression)->format('D d M Y @ H:i'); ?>";
});
}
}

Как видно из приведённого выше кода, мы определили новую директиву @friendlyDateTime, которая принимает строку, например $user->created_at. Когда шаблоны Blade будут скомпилированы в PHP-код, это будет выглядеть так:

<?php echo ($user->created_at)->format('D d M Y @ H:i'); ?>

В наших шаблонах Blade вы должны иметь возможность использовать директиву @friendlyDateTime. Вот несколько примеров, как вы можете её использовать:

@friendlyDateTime(\Carbon\Carbon::parse('2023-03-24 14:30:00'))

@friendlyDateTime(now())

@friendlyDateTime($user->created_at)

@friendlyDateTime($post->updated_at)

@friendlyDateTime($user->last_login_at)

Как видите создавать собственные директивы Blade относительно просто. Вы также можете добавить к директивам более сложную логику. Например, вы можете добавить возможность для пользователей вашего приложения выбирать отображаемый формат даты (который, как мы предполагаем, хранится в поле datetime_format в таблице users).

Для этого вы можете изменить код директивы Blade следующим образом:

<?php

// ...
public function boot()
{
Blade::directive('friendlyDateTime', function (string $expression): string {
return "<?php echo ($expression)->format(auth()->datetime_format); ?>";
});
}
// ...

Если бы мы предположили, что некоторые пользователи предпочли бы видеть Fri Mar 24 2023 @ 14:30 вместо Fri 24 Mar 2023 @ 14:30, эта директива справилась бы с этим без необходимости добавлять какую-либо условную логику в наш шаблон.

Заключение

Надеюсь эта статья дала вам представление, что такое Blade директивы, как они работают и как создавать собственные директивы.

Дополнительные материалы

Предыдущая Статья

Внедрение PHP-CS-Fixer в легаси PHP-проекты

Следующая Статья

Laravel 10: Чтение JSON файлов