Недавно у меня была задача с полем 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
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.