Директива once
Директива once в Blade позволяет выполнить переданный код только один раз за весь процесс рендеринга, даже если шаблон используется несколько раз в одном запросе. Это особенно полезно для регистрации ресурсов, подключения стилей или скриптов, которые должны быть добавлены только один раз, независимо от того, сколько раз компонент или фрагмент шаблона вызывается в процессе построения страницы.
Директива принимает единственный параметр - замыкание (анонимную функцию), которое содержит код, подлежащий однократному выполнению. Laravel автоматически определяет уникальность вызова на основе содержимого шаблона и места вызова директивы.
Синтаксис
@once
{{-- Code that will be executed only once --}}
@endonce
Пример
Давайте рассмотрим пример, где директива once используется в повторяющемся компоненте, чтобы стили и скрипты были добавлены только один раз:
<div class="card">
<h3>{{ $title }}</h3>
<p>{{ $content }}</p>
</div>
@once
<link rel="stylesheet" href="css/card.css">
<script src="js/card.js"></script>
@endonce
Пример
Директиву once можно использовать для регистрации глобальных объектов или выполнения тяжёлых операций однократно. Например, для инициализации вспомогательной переменной при рендеринге страницы:
<!DOCTYPE html>
<html>
<head>
<title>App</title>
@once
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="favicon.ico">
@endonce
</head>
<body>
@yield('content')
</body>
</html>
Пример
Вложенные вызовы once также работают корректно. Каждая директива обрабатывается независимо, и выполнение произойдёт только один раз для каждой из них. Рассмотрим пример с иерархией шаблонов и макетов:
<div class="modal">
<div class="modal-content">
{{ $slot }}
</div>
</div>
@once
@once
<script>
console.log('Inner once block');
</script>
@endonce
<script>
console.log('Outer once block');
</script>
@endonce
Пример
Директива once может быть полезна при использовании компонентов с подгрузкой ресурсов через CDN, чтобы избежать дублирования подключений. Покажем, как реализовать такой подход:
<table>
<thead>
<tr>
<th>#</th>
<th>Name</th>
</tr>
</thead>
<tbody>
@foreach($items as $item)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $item }}</td>
</tr>
@endforeach
</tbody>
</table>
@once
<link rel="stylesheet" href="https://cdn.example.com/table.min.css">
<script src="https://cdn.example.com/table.min.js"></script>
@endonce