Создаём свою собственную Blade команду: На примере br2nl в Laravel

Laravel Blade. Свои команды

Недавно у меня была задача с полем textarea — сохранять данные для перевода строки, но не показывать их в форме. Для подобного преобразования есть php функция nl2br, но нет команды делающей обратное — br2nl. Вместо этого конечно можно просто использовать свой метод, а вот как его добавить в Blade? А я покажу!

Для начала, нашёл «неофициальный» метод в комментариях на сайте PHP.net:

function br2nl($string)
{
    return preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string);
}

 

Хорошо, но как нам использовать это в шаблонах для обработки значений textarea? Нужно, что-то вроде этого:

<textarea>{{ br2nl($post->post_text) }}</textarea>

Конечно, мы можем зарегистрировать эту функцию как помощник (helper), добавить ее в PSR-4 в composer.json и использовать так.
Но, поскольку она будет использоваться только в шаблонах, я решил создать отдельную команду Blade, поэтому она будет работать так:

<textarea>@br2nl($post->post_text)</textarea>

Для этого нам нужно зарегистрировать её в app/Providers/AppServiceProvider.php в методе boot():

public function boot()
{
    Blade::directive('br2nl', function ($string) {
        return "<?php echo preg_replace('/\<br(\s*)?\/?\>/i', \"\n\", $string); ?>";
    });
}

Обратите внимание, что мы возвращаем не просто обработанную строку, нам нужно вернуть синтаксис PHP, выводящий её.

В завершении, почистим кэш шаблонов:

php artisan view:clear

Вот и все! Нигде и ничего больше менять не нужно. Вот так просто добавляются команды в Blade.

Дополнительную информацию вы можете найти в официальной документации — см. раздел Extending Blade.

 

Автор: Povilas Korop
Перевод: Demiurge Ash