Директива отмены экранирования
Директива {!! !!} применяется в шаблонах Blade для вывода неэкранированного HTML-кода. В отличие от стандартного вывода через {{ }}, который экранирует все HTML-теги, директива {!! !!} выводит строку без изменений, позволяя браузеру интерпретировать её как HTML-разметку. Это особенно полезно при выводе контента, который уже содержит HTML-теги, например, текст из редактора или сгенерированную разметку.
Важно использовать данную директиву только с проверенными данными, чтобы избежать XSS-атак. Для экранирования вывода следует использовать {{ }}, а {!! !!} - только когда требуется отобразить именно HTML-разметку.
Синтаксис
{!! $htmlContent !!}
Пример
Давайте выведем простой HTML-код, переданный из контроллера:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class PageController extends Controller
{
public function index()
{
$html = '<h1>Hello</h1><p>This is a paragraph</p>';
return view('page', ['html' => $html]);
}
}
<div>
{!! $html !!}
</div>
Результат выполнения кода:
<div>
<h1>Hello</h1>
<p>This is a paragraph</p>
</div>
Пример
Сравним вывод с экранированием и без. В первом случае используем стандартный вывод, во втором - директиву {!! !!}:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class PageController extends Controller
{
public function index()
{
$text = '<strong>important</strong> text';
return view('page', ['text' => $text]);
}
}
<div>
<p>Escaped: {{ $text }}</p>
<p>Unescaped: {!! $text !!}</p>
</div>
Результат выполнения кода:
<div>
<p>Escaped: <strong>important</strong> text</p>
<p>Unescaped: <strong>important</strong> text</p>
</div>
Пример
Выведем список статей, где заголовки обёрнуты в HTML-теги. Такой подход удобен, когда данные приходят из базы данных уже с разметкой:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::select('title_html')->get();
return view('articles', ['articles' => $articles]);
}
}
<ul>
@foreach ($articles as $article)
<li>
{!! $article->title_html !!}
</li>
@endforeach
</ul>
Результат выполнения кода:
<ul>
<li>
<h2>First article</h2>
</li>
<li>
<h2>Second article</h2>
</li>
<li>
<h2>Third article</h2>
</li>
</ul>