Директива @pushOnce
Директива @pushOnce применяется в Blade-шаблонах Laravel для добавления содержимого в именованный стек. В отличие от обычной директивы @push, которая добавляет содержимое каждый раз при вызове, директива @pushOnce гарантирует, что содержимое будет добавлено только один раз за всё время выполнения запроса. Директива принимает один обязательный параметр - имя стека. Используется совместно с директивой @stack для вывода содержимого стека в нужном месте шаблона.
Синтаксис
@pushOnce('stack_name')
<!-- содержимое для добавления -->
@endpushOnce
Пример
Давайте рассмотрим базовый пример использования директивы @pushOnce в шаблоне:
<html>
<head>
<title>Laravel App</title>
@stack('styles')
</head>
<body>
@yield('content')
@stack('scripts')
</body>
</html>
@extends('layouts.app')
@section('content')
<h1>Главная страница</h1>
@pushOnce('scripts')
<script src="app.js"></script>
@endpushOnce
@pushOnce('scripts')
<script src="app.js"></script>
@endpushOnce
@endsection
Результат выполнения кода в секции head:
<script src="app.js"></script>
Пример
Рассмотрим пример с подключением CSS-стилей, где директива @pushOnce предотвращает дублирование подключений:
<header>
<h1>Заголовок сайта</h1>
@pushOnce('styles')
<link rel="stylesheet" href="header.css">
@endpushOnce
</header>
<footer>
<p>Футер сайта</p>
@pushOnce('styles')
<link rel="stylesheet" href="footer.css">
@endpushOnce
</footer>
@extends('layouts.app')
@section('content')
@include('partials.header')
<main>
<p>Основное содержимое</p>
</main>
@include('partials.footer')
@endsection
Результат выполнения кода в секции head:
<link rel="stylesheet" href="header.css">
<link rel="stylesheet" href="footer.css">
Пример
Давайте рассмотрим ситуацию, когда используется условие для добавления содержимого в стек:
@extends('layouts.app')
@section('content')
<article>
<h2>{{ $post->title }}</h2>
<p>{{ $post->content }}</p>
</article>
@if ($post->has_comments)
@pushOnce('scripts')
<script src="comments.js"></script>
@endpushOnce
<div id="comments">
<!-- Комментарии -->
</div>
@endif
@pushOnce('styles')
<link rel="stylesheet" href="post.css">
@endpushOnce
@endsection
Результат выполнения кода в секции head:
<link rel="stylesheet" href="post.css">
<script src="comments.js"></script>