Laravel blade подключить файл
Этот перевод актуален для англоязычной документации на 04.12.2014 (ветка 4.2) , 25.05.2014 (ветка 4.1) и 16.10.2014 (ветка 4.0). Опечатка? Выдели и нажми Ctrl+Enter.
Включение подшаблонов
Включение подшаблонов является повторение функционала компонентов, только в "старом" стиле.
Blade-директива @include позволяет вам включать Blade-шаблон в другой шаблон. Все переменные, доступные родительскому шаблону, будут доступны и включаемому шаблону:
Хотя включаемый шаблон унаследует все данные, доступные родительскому шаблону, вы также можете передать в него массив дополнительных данных:
Само собой, если вы попробуете сделать @include шаблона, которого не существует, то Laravel выдаст ошибку. Если вы хотите включить шаблон, которого может не существовать, вам надо использовать директиву @includeIf :
Если вы хотите включить ( @include ) шаблон в зависимости от логического условия, можно использовать директиву @includeWhen :
Вам следует избегать использования констант __DIR__ и __FILE__ в ваших Blade-шаблонах, поскольку они будут ссылаться на расположение кешированных, скомпилированных шаблонов.
Переменная Loop
При работе с циклами внутри цикла будет доступна переменная PHP $loop . Эта переменная предоставляет доступ к некоторым полезным данным, например, текущий индекс цикла, или находитесь ли вы на первой или последней итерации цикла:
Если вы во вложенном цикле, вы можете обратиться к переменной PHP $loop родительского цикла через свойство PHP parent :
Переменная PHP $loop содержит также множество других полезных свойств:
Свойство | Описание |
---|---|
$loop->index | Индекс текущей итерации цикла (начинается с 0). |
$loop->iteration | Текущая итерация цикла(начинается с 1). |
$loop->remaining | Число оставшихся итераций цикла. |
$loop->count | Общее число элементов итерируемого массива. |
$loop->first | Первая ли это итерация цикла. |
$loop->last | Последняя ли это итерация цикла. |
$loop->depth | Уровень вложенности текущего цикла. |
$loop->parent | Переменная loop родительского цикла, для вложенного цикла. |
Отображение данных
Вы можете отобразить данные, переданные в ваши Blade-представления, обернув переменную в фигурные скобки. Например, для такого маршрута:
Вы можете отобразить содержимое переменной name вот так:
Вы не ограничены отображением только содержимого переменных, передаваемых в представление. Вы также можете выводить результаты любых PHP-функций. На самом деле, вы можете поместить любой необходимый PHP-код в оператор вывода Blade:
Blade-оператор PHP > автоматически отправляется через PHP-функцию PHP htmlentities () для предотвращения XSS-атак.
Вывод переменных после проверки на существование
Иногда вам надо вывести значение переменной, но вы не уверены, задано ли оно. То есть вы хотите сделать так:
Вместо написания тернарного оператора Blade позволяет вам использовать такое удобное сокращение, которое будет скомпилировано в тернарный оператор, приведённый ранее:
Если переменная $name имеет значение, то оно будет отображено, иначе будет выведено слово Default .
Вывод неэкранированных данных
По умолчанию Blade-оператор PHP > автоматически отправляется через PHP-функцию PHP htmlentities () для предотвращения XSS-атак. Если вы не хотите экранировать данные, используйте такой синтаксис:
Будьте очень осторожны и экранируйте переменные, которые содержат ввод от пользователя. Всегда используйте экранирование синтаксисом с двойными скобками, чтобы предотвратить XSS-атаки при отображении предоставленных пользователем данных.
Как показывает практика, вместо экранирования только пользовательских переменных безопаснее экранировать весь вывод, делая исключения только в редких случаях — прим. пер.
Наследование Blade
Blade позволяет вам определять даже свои собственные директивы с помощью метода PHP directive () . Когда компилятор Blade встречает пользовательскую директиву, он вызывает предоставленный обратный вызов с содержащимся в директиве выражением.
Следующий пример создаёт директиву PHP @ datetime ( $var ) , которая форматирует данный PHP $var , который должен быть экземпляром DateTime :
Как видите, мы прицепили метод PHP format () к тому выражению, которое передаётся в директиву. Поэтому финальный PHP-код, сгенерированный этой директивой, будет таким:
После изменения логики директивы Blade вам надо удалить все кешированные представления Blade. Это можно сделать Artisan-командой sh view:clear .
Стеки
Blade позволяет использовать именованные стеки, которые могут быть отрисованы где-нибудь ещё в другом шаблоне или макете. Это удобно в основном для указания любых JavaScript-библиотек, требуемых для ваших дочерних шаблонов:
"Пушить" в стек можно сколько угодно раз. Для отрисовки всего содержимого стека передайте имя стека в директиву @stack :
If you would like to prepend content onto the beginning of a stack, you should use the @prepend directive:
Если вам нужно добавить контент в начало стека используйте директиву @prepend :
@push('scripts') Это будет в конце @endpush
// в другом месте кода
@prepend('scripts') А это в начале @endprepend
Отрисовка шаблонов для коллекций
Вы можете комбинировать циклы и включения в одной строке при помощи Blade-директивы @each :
Первый аргумент — часть шаблона, которую надо отрисовать для каждого элемента массива или коллекции. Второй аргумент — массив или коллекция для перебора, а третий — имя переменной, которое будет назначено для текущей итерации в шаблоне. Например, если вы перебираете массив jobs , то скорее всего захотите обращаться к каждому элементу как к переменной job внутри вашей части шаблона. Ключ для текущей итерации будет доступен в виде переменной key в вашей части шаблона.
Вы также можете передать четвёртый аргумент в директиву @each . Этот аргумент определяет шаблон, который будет отрисовано, если данный массив пуст.
Переменные из родительского шаблона не передаются при использовании директивы @each . Используйте вместо неё @foreach или @include , если вам нужно такое поведение.
Управляющие конструкции
В дополнение к наследованию шаблонов и отображению данных Blade предоставляет удобные сокращения для распространенных управляющих конструкций PHP, таких как условные операторы и циклы. Эти сокращения обеспечивают очень чистый и краткий способ работы с управляющими конструкциями PHP и при этом остаются очень похожими на свои PHP-прообразы.
Стеки
Blade позволяет использовать именованные стеки, которые могут быть отрисованы где-нибудь ещё в другом представлении или макете. Это удобно в основном для указания любых JavaScript-библиотек, требуемых для ваших дочерних представлений:
«Пушить» в стек можно сколько угодно раз. Для отрисовки всего содержимого стека передайте имя стека в директиву PHP @ stack :
Циклы
В дополнение к условным операторам Blade предоставляет простые директивы для работы с конструкциями циклов PHP. Данные директивы тоже идентичны их PHP-прообразам:
При работе с циклами вы можете использовать переменную loop для получения полезной информации о цикле, например, находитесь ли вы на первой или последней итерации цикла.
При работе с циклами вы также можете закончить цикл или пропустить текущую итерацию:
Также можно включить условие в строку объявления директивы:
Шаблоны Blade
Blade — простой, но мощный шаблонизатор, входящий в состав Laravel. В отличии от шаблонов контроллеров, Blade основан на концепции наследования шаблонов и секциях. Все шаблоны Blade должны иметь расширение .blade.php .
Создание шаблона Blade
Использование шаблона Blade
Заметьте, что шаблоны, которые расширяют другой Blade-шаблон с помощью @extend, просто перекрывают секции последнего. Старое (перекрытое) содержимое может быть выведено директивой @parent.
Иногда — например, когда вы не уверены, что секция была определена — вам может понадобиться указать значение по умолчанию для директивы @yield. Вы можете передать его вторым аргументом:
Компоненты и слоты
Компоненты и слоты предоставляют аналогичные преимущества для секций и макетов; однако, некоторые могут счесть ментальную модель компонентов и слотов более простой в понимании. Во-первых, давайте представим повторно используемый компонент "оповещения", который мы хотели бы использовать повторно в нашем приложении:
Переменная > будет соджержать контент, который мы хотим внедрить в компонент. Теперь чтобы сконструировать этот компонент мы можем использовать Blade-директиву @component :
Иногда бывает полезно определить несколько слотов для компонента. Давайте модифицируем наш компонент оповещений, чтобы разрешить внедрение "заголовка". Именованные слоты могут отображаться просто путем "отражения" переменной, которая соответствует их имени:
Теперь мы можем внедрить контент в именованный слот, используя директиву @slot . Любой контент, не входящий в директиву @slot , будет передан компоненту в переменной $slot :
Передача дополнительных данных компоненту
Иногда вам может потребоваться передать дополнительные данные компоненту. Для этой цели вы можете передать массив данных в качестве второго аргумента директиве @component . Все данные будут доступны для шаблона компонента как переменные:
Введение
Blade — простой, но мощный шаблонизатор, поставляемый с Laravel. В отличие от других популярных шаблонизаторов для PHP Blade не ограничивает вас в использовании чистого PHP-кода в ваших представлениях. На самом деле все представления Blade скомпилированы в чистый PHP-код и кешированы, пока в них нет изменений, а значит, Blade практически не нагружает ваше приложение. Файлы представлений Blade используют расширение .blade.php и обычно хранятся в папке resources/views .
Другие директивы Blade
Оператор If
Вы можете конструировать оператор if при помощи директив @if , @elseif , @else и @endif . Эти директивы работают идентично своим PHP-прообразам:
Для удобства Blade предоставляет и директиву @unless :
В дополнение к обычным директивам, которые мы уже обсуждали, можно использовать и директивы @isset и @empty в виде удобных сокращений для их соответствующих PHP-функций:
Blade шаблоны
Blade не только делает код представлений элегантным, но еще и дает прекрасный метод использования шаблонов в вашем представлении. Например, пусть ваше приложение использует представление "master" для обеспечения общего вида и поведения приложения. Это может выглядеть так:
Заметьте, произведена вставка секции "content". Нам нужно заполнить эту секцию некоторым текстом так, чтобы другое представление использовало этот макет:
Отлично! Теперь мы просто возвращаем 'profile' представление из маршрута:
Представление profile автоматически использует шаблон "master" благодаря @layout выражению Blade.
Иногда нужно вставить что-то в секцию, не переписывая ее код. Например, добавить элемент списка. Сделаем это так:
Заметили конструкцию Blade @parent? Она будет заменена на секцию навигациии 'navigation' из 'master' шаблона, предоставляя гибкий инструмент по управлению контентом в шаблонах и представлениях, делая их расширямыми и наследуемыми.
Базы данных:
Статистика: Символов — 4 167/3 538 без пробелов (2 771/2 407 без кода):, слов — 365
Этот перевод актуален для англоязычной документации на 28.01.2017 (ветка 5.3) , 08.12.2016 (ветка 5.2) и 19.06.2016 (ветка 5.1). Опечатка? Выдели и нажми Ctrl+Enter.
Комментарии
Blade также позволяет вам определить комментарии в ваших шаблонах. Но в отличие от HTML-комментариев, Blade-комментарии не включаются в HTML-код, возвращаемый вашим приложением:
В некоторых случаях бывает полезно встроить PHP-код в ваши шаблоны. Вы можете использовать Blade-директиву @php для выполнения блока чистого PHP в вашем шаблоне:
Несмотря на то, что в Blade есть эта возможность, её частое использование может быть сигналом того, что у вас слишком много встроенной в шаблон логики.
Внедрение сервисов
Директива @inject служит для извлечения сервиса из сервис-контейнера Laravel. Первый аргумент, передаваемый в @inject , это имя переменной, в которую будет помещён сервис. А второй аргумент — имя класса или интерфейса сервиса, который вы хотите извлечь:
Интерпретатор шаблонов Blade
Blade позволяет изящно писать ваши шаблоны. Для создания blade шаблона, файл представления должен иметь расширение ".blade.php". Blade позволяет создавать красивый, ненавязчивый синтаксис PHP структур с отображением данных. Например:
Blade отображение переменной:
Внимание: этот код открыт для XSS-атак - если $name доступен для изменения пользователем, то на его место можно вставить произвольный HTML-код. Blade, как и простой код на PHP, не экранирует вывод, поэтому вам нужно следить, чтобы выводимые строки содержали экранированый HTML. Альтернативные шаблонизаторы, такие как HTMLki, делают это автоматически. - прим. пер.
Blade вывод результата функции:
Вставка представления:
Примечание: При использовании @include выражения Blade, представление автоматически наследует все данные из текущего представления.
Создание циклов при помощи Blade:
Blade другие управляющие структуры:
Структура "for-else":
Структура "unless":
Комментарии в Blade :
Примечание: Комментарии Blade, в отличие от HTML комментариев, не отображаются в исходном коде страницы.
Управляющие конструкции
В дополнение к наследованию шаблонов и отображению данных Blade предоставляет удобные сокращения для распространенных управляющих конструкций PHP, таких как условные операторы и циклы. Эти сокращения обеспечивают очень чистый и краткий способ работы с управляющими конструкциями PHP и при этом остаются очень похожими на свои PHP-прообразы.
Blade и JavaScript-фреймворки
Поскольку многие JavaScript-фреймворки тоже используют фигурные скобки для обозначения того, что данное выражение должно быть отображено в браузере, то вы можете использовать символ @ , чтобы указать механизму отрисовки Blade, что выражение должно остаться нетронутым. Например:
В этом примере Blade удалит символ @ , но выражение PHP > останется нетронутым, что позволит вашему JavaScript-фреймворку отрисовать его вместо Blade.
Директива PHP @ verbatim
Если вы выводите JavaScript-переменные в большой части вашего шаблона, вы можете обернуть HTML директивой PHP @ verbatim , тогда вам не нужно будет ставить символ PHP @ перед каждым оператором вывода Blade:
Вывод сырого текста в фигурных скобках
Если вам нужно вывести строку в фигурных скобках, вы можете отменить её обработку с помощью Blade, поставив перед текстом символ @ :
Конечно, весь пользовательский ввод должен быть экранирован или очищен. Для экранирования используйте тройные скобки:
Если вы не хотите экранировать данные, используйте двойные скобки:
Внимание: будьте очень осторожны и экранируйте переменные, которые содержат ввод от пользователя. Всегда используйте тройные скобки, чтобы преобразовать HTML-сущности в переменной в текст.
Как показывает практика, вместо экранирования только пользовательских переменных безопаснее экранировать весь вывод, делая исключения только в редких случаях — прим. пер.
Blade — простой, но мощный шаблонизатор, поставляемый с Laravel. В отличие от других популярных шаблонизаторов для PHP Blade не ограничивает вас в использовании чистого PHP-кода в ваших шаблонах. На самом деле все шаблоны Blade скомпилированы в чистый PHP-код и кешированы, пока в них нет изменений, а значит, Blade практически не нагружает ваше приложение. Файлы шаблонов Blade используют расширение .blade.php и обычно хранятся в директории resources/views .
Формы
Собственные условные выражения
Blade::if в методе boot сервис-провайдера AppServiceProvider позволяет создать свою директиву, которая управляет выводом в зависимости от аргумента, поданного ей на вход.
Once the custom conditional has been defined, we can easily use it on our templates:
Теперь, задав имя новой директивы env , мы можем использовать в шаблонах директивы @env , @elseenv и @unlessenv
Ваше приложение, скорее всего, имеет общее оформление для большинства страниц. Ручное оформление этого шаблона для каждого действия наверняка утомительно. Определение шаблона для приложения сделают, конечно же, разработку более приятной. Начнем:
Указание свойства "layout" в контроллере:
Доступ к шаблону из действий контроллера:
Примечание: Когда используется шаблон, действие не должно больше ничего возвращать.
Стеки
Blade позволяет использовать именованные стеки, которые могут быть отрисованы где-нибудь ещё в другом шаблоне или макете. Это удобно в основном для указания любых JavaScript-библиотек, требуемых для ваших дочерних шаблонов:
"Пушить" в стек можно сколько угодно раз. Для отрисовки всего содержимого стека передайте имя стека в директиву @stack :
Наследование шаблонов
Секции
Секции представлений предоставляют простой инструмент вставки контента в шаблон из вложенных представлений. Например, вам нужно вставить JavaScript в ваш шаблон из вложенного представления в заголовок шаблона. Создаем секцию:
Создание секции в представлении:
Вставка контента секции:
Использование сокращений Blade при работе с секциями:
Наследование макета
При определении дочернего представления используйте Blade-директиву @extends для указания макета, который должен быть «унаследован» дочерним представлением. Представления, которые наследуют макет Blade, могут внедрять содержимое в секции макета с помощью директив @section . Запомните, как видно из приведённого выше примера, содержимое этих секций будет отображено в макете при помощи @yield :
В этом примере секция sidebar использует директиву @parent для дополнения (а не перезаписи) содержимого к боковой панели макета. Директива @parent будет заменена содержимым макета при отрисовке представления.
Blade-представления могут быть возвращены из маршрутов при помощи глобальной вспомогательной функции PHP view () :
Комментарии
Blade также позволяет вам определить комментарии в ваших шаблонах. Но в отличие от HTML-комментариев, Blade-комментарии не включаются в HTML-код, возвращаемый вашим приложением:
В некоторых случаях бывает полезно встроить PHP-код в ваши шаблоны. Вы можете использовать Blade-директиву @php для выполнения блока чистого PHP в вашем шаблоне:
Несмотря на то, что в Blade есть эта возможность, её частое использование может быть сигналом того, что у вас слишком много встроенной в шаблон логики.
Переменная Loop
При работе с циклами внутри цикла будет доступна переменная $loop . Эта переменная предоставляет доступ к некоторым полезным данным, например, текущий индекс цикла, или находитесь ли вы на первой или последней итерации цикла:
Если вы во вложенном цикле, вы можете обратиться к переменной $loop родительского цикла через свойство parent :
Переменная $loop одержит также множество других полезных свойств:
Свойство | Описание |
---|---|
$loop->index | Индекс текущей итерации цикла (начинается с 0). |
$loop->iteration | Текущая итерация цикла (начинается с 1). |
$loop->remaining | Число оставшихся итераций цикла. |
$loop->count | Общее число элементов итерируемого массива. |
$loop->first | Первая ли это итерация цикла. |
$loop->last | Последняя ли это итерация цикла. |
$loop->even | Чётная ли это итерация цикла. |
$loop->odd | Нечётная ли это итерация цикла. |
$loop->depth | Уровень вложенности текущего цикла. |
$loop->parent | Переменная loop родительского цикла, для вложенного цикла. |
Фреймворки Blade и JavaScript
Поскольку многие JavaScript-фреймворки тоже используют фигурные скобки для обозначения того, что данное выражение должно быть отображено в браузере, то вы можете использовать символ @ , чтобы указать механизму отрисовки Blade, что выражение должно остаться нетронутым. Например:
В этом примере Blade удалит символ @ , но выражение > останется нетронутым, что позволит вашему JavaScript-фреймворку отрисовать его вместо Blade.
Директива @verbatim
Если вы выводите JavaScript-переменные в большой части вашего шаблона, вы можете обернуть HTML директивой @verbatim , тогда вам не нужно будет ставить символ @ перед каждым оператором вывода Blade:
Наследование Blade
Blade позволяет вам определять даже свои собственные директивы с помощью метода directive . Когда компилятор Blade встречает пользовательскую директиву, он вызывает предоставленный обратный вызов с содержащимся в директиве выражением.
Следующий пример создаёт директиву @datetime($var) , которая форматирует данный $var , который должен быть экземпляром DateTime :
Как видите, мы прицепили метод format к тому выражению, которое передаётся в директиву. Поэтому финальный PHP-код, сгенерированный этой директивой, будет таким:
После изменения логики директивы Blade вам надо удалить все кешированные шаблоны Blade. Это можно сделать Artisan-командой view:clear .
Blade — простой, но мощный шаблонизатор, поставляемый с Laravel. В отличие от других популярных шаблонизаторов для PHP Blade не ограничивает вас в использовании чистого PHP-кода в ваших шаблонах. На самом деле все шаблоны Blade скомпилированы в чистый PHP-код и кешированы, пока в них нет изменений, а значит, Blade практически не нагружает ваше приложение. Файлы шаблонов Blade используют расширение .blade.php и обычно хранятся в директории resources/views .
Отображение ошибок валидации
Ошибки валидации для заданного поля можно показать при помощи директивы @error . Название поля указывается в аргументе директивы. Текст ошибки будет содержаться в переменной $message внутри директивы:
Вторым аргументом вы можете явно указать имя MessageBag формы, если на странице находятся несколько форм.
Циклы
В дополнение к условным операторам Blade предоставляет простые директивы для работы с конструкциями циклов PHP. Данные директивы тоже идентичны их PHP-прообразам:
При работе с циклами вы можете использовать переменную loop для получения полезной информации о цикле, например, находитесь ли вы на первой или последней итерации цикла.
При работе с циклами вы также можете закончить цикл или пропустить текущую итерацию:
Также можно включить условие в строку объявления директивы:
Вывод переменных после проверки на существование
Иногда вам надо вывести значение переменной, но вы не уверены, задано ли оно. То есть вы хотите сделать так:
Вместо написания тройного оператора Blade позволяет вам использовать такое удобное сокращение:
Фреймворки Blade и JavaScript
Поскольку многие JavaScript-фреймворки тоже используют фигурные скобки для обозначения того, что данное выражение должно быть отображено в браузере, то вы можете использовать символ @ , чтобы указать механизму отрисовки Blade, что выражение должно остаться нетронутым. Например:
В этом примере Blade удалит символ @ , но выражение > останется нетронутым, что позволит вашему JavaScript-фреймворку отрисовать его вместо Blade.
Директива @verbatim
Если вы выводите JavaScript-переменные в большой части вашего шаблона, вы можете обернуть HTML директивой @verbatim , тогда вам не нужно будет ставить символ @ перед каждым оператором вывода Blade:
Отображение данных
Вы можете отобразить данные, переданные в ваши Blade-шаблоны, обернув переменную в фигурные скобки. Например, для такого роута:
Вы можете отобразить содержимое переменной name вот так:
Конечно, вы не ограничены отображением только содержимого переменных, передаваемых в шаблон. Вы также можете выводить результаты любых PHP-функций. На самом деле, вы можете поместить любой необходимый PHP-код в оператор вывода Blade:
Blade-оператор > автоматически отправляется через PHP-функцию htmlspecialchars для предотвращения XSS-атак.
Вывод неэкранированных данных
По умолчанию Blade-оператор > автоматически отправляется через PHP-функцию htmlspecialchars для предотвращения XSS-атак. Если вы не хотите экранировать данные, используйте такой синтаксис:
Будьте очень осторожны и экранируйте переменные, которые содержат ввод от пользователя. Всегда используйте экранирование синтаксисом с двойными скобками, чтобы предотвратить XSS-атаки при отображении предоставленных пользователем данных.
Определение макета
Два основных преимущества использования Blade — наследование шаблонов и секции. Для начала давайте рассмотрим простой пример. Во-первых, изучим макет «главной» страницы. Поскольку многие веб-приложения используют один общий макет для разных страниц, удобно определить этот макет как одно представление Blade:
Как видите, этот файл имеет типичную HTML-разметку. Но обратите внимание на директивы @section и @yield . Директива @section , как следует из её названия, определяет секцию содержимого, а директива @yield используется для отображения содержимого данной секции.
Мы определили макет для нашего приложения, давайте определим дочернюю страницу, которая унаследует макет.
Собственные директивы
Blade позволяет вам определять даже свои собственные директивы с помощью метода directive . Когда компилятор Blade встречает пользовательскую директиву, он вызывает предоставленный обратный вызов с содержащимся в директиве выражением.
Следующий пример создаёт директиву @datetime($var) , которая форматирует данный $var , который должен быть экземпляром DateTime :
Как видите, мы прицепили метод format к тому выражению, которое передаётся в директиву. Поэтому финальный PHP-код, сгенерированный этой директивой, будет таким:
После изменения логики директивы Blade вам надо удалить все кешированные шаблоны Blade. Это можно сделать Artisan-командой view:clear .
Циклы
В дополнение к условным операторам Blade предоставляет простые директивы для работы с конструкциями циклов PHP. Данные директивы тоже идентичны их PHP-прообразам:
При работе с циклами вы можете использовать переменную loop для получения полезной информации о цикле, например, находитесь ли вы на первой или последней итерации цикла.
При работе с циклами вы также можете закончить цикл или пропустить текущую итерацию:
Также можно включить условие в строку объявления директивы:
Отрисовка представлений для коллекций
Вы можете комбинировать циклы и включения в одной строке при помощи Blade-директивы @each :
Первый аргумент — часть представления, которую надо отрисовать для каждого элемента массива или коллекции. Второй аргумент — массив или коллекция для перебора, а третий — имя переменной, которое будет назначено для текущей итерации в представлении. Например, если вы перебираете массив jobs , то скорее всего захотите обращаться к каждому элементу как к переменной job внутри вашей части представления. Ключ для текущей итерации будет доступен в виде переменной key в вашей части представления.
Вы также можете передать четвёртый аргумент в директиву @each . Этот аргумент определяет представление, которое будет отрисовано, если данный массив пуст.
Наследование шаблонов
Включение подшаблонов
Включение подшаблонов является повторение функционала компонентов, только в "старом" стиле.
Blade-директива @include позволяет вам включать Blade-шаблон в другой шаблон. Все переменные, доступные родительскому шаблону, будут доступны и включаемому шаблону:
Хотя включаемый шаблон унаследует все данные, доступные родительскому шаблону, вы также можете передать в него массив дополнительных данных:
Само собой, если вы попробуете сделать @include шаблона, которого не существует, то Laravel выдаст ошибку. Если вы хотите включить шаблон, которого может не существовать, вам надо использовать директиву @includeIf :
Если вы хотите включить ( @include ) шаблон в зависимости от логического условия, можно использовать директиву @includeWhen (подключение состоится, если $boolean равно true) или директиву @includeUnless (подключение состоится, если $boolean равно false):
Директива includeFirst подключает первый найденный шаблон:
Вам следует избегать использования констант __DIR__ и __FILE__ в ваших Blade-шаблонах, поскольку они будут ссылаться на расположение кешированных, скомпилированных шаблонов.
Алиасы для подключений
If your Blade includes are stored in a subdirectory, you may wish to alias them for easier access. For example, imagine a Blade include that is stored at resources/views/includes/input.blade.php with the following content:
Можно задать алиас для подключения шаблона, если не хотите каждый раз обращаться к нему по длинному пути. Например, у вас есть шаблон resources/views/includes/input.blade.php со следующим контентом:
Можете создать алиас input из шаблона includes.input в методе boot сервис-провайдера AppServiceProvider :
Теперь вы можете использовать этот алиас как новую директиву в шаблонах:
Оператор Switch
Функционал выбора отображения исходя заданных условий (switch) конструируется при помощи директив @switch , @case , @break , @default и @endswitch :
Комментарии (4)
попробуйте так :
$name ?? 'Default'
А если наоборот, файл app.blade.php хранится во resources/views, а подключаемые элементы во resources/views/layouts, как тогда app.blade.php подключить в @extends?
Определение макета
Два основных преимущества использования Blade — наследование шаблонов и секции. Для начала давайте рассмотрим простой пример. Во-первых, изучим макет "главной" страницы. Поскольку многие веб-приложения используют один общий макет для разных страниц, удобно определить этот макет как один шаблон Blade:
Как видите, этот файл имеет типичную HTML-разметку. Но обратите внимание на директивы @section и @yield . Директива @section , как следует из её названия, определяет секцию содержимого, а директива @yield используется для отображения содержимого заданной секции.
Мы определили макет для нашего приложения, давайте определим дочернюю страницу, которая унаследует макет.
Определение макета
Два основных преимущества использования Blade — наследование шаблонов и секции. Для начала давайте рассмотрим простой пример. Во-первых, изучим макет "главной" страницы. Поскольку многие веб-приложения используют один общий макет для разных страниц, удобно определить этот макет как один шаблон Blade:
Как видите, этот файл имеет типичную HTML-разметку. Но обратите внимание на директивы @section и @yield . Директива @section , как следует из её названия, определяет секцию содержимого, а директива @yield используется для отображения содержимого заданной секции.
Мы определили макет для нашего приложения, давайте определим дочернюю страницу, которая унаследует макет.
Шаблоны контроллеров
Один из способов использования шаблонов в Laravel — в виде шаблонов контроллеров. Если в классе контроллера определить свойство PHP layout , то указанный шаблон будет создан автоматически и будет использоваться при генерации ответа клиенту.
Определение шаблона контроллера
Внедрение сервисов
Директива @inject служит для извлечения сервиса из сервис-контейнера Laravel. Первый аргумент, передаваемый в @inject , это имя переменной, в которую будет помещён сервис. А второй аргумент — имя класса или интерфейса сервиса, который вы хотите извлечь:
Компоненты и слоты
Компоненты и слоты предоставляют аналогичные преимущества для секций и макетов; однако, некоторые могут счесть ментальную модель компонентов и слотов более простой в понимании. Во-первых, давайте представим повторно используемый компонент "оповещения", который мы хотели бы использовать повторно в нашем приложении:
Переменная > будет соджержать контент, который мы хотим внедрить в компонент. Теперь чтобы сконструировать этот компонент мы можем использовать Blade-директиву @component :
Можно указать несколько имён файлов шаблонов, Laravel будет использовать тот, который найдётся первым, перебирая их в указанном порядке. Для этого служит директива componentFirst :
Иногда бывает полезно определить несколько слотов для компонента. Давайте модифицируем наш компонент оповещений, чтобы разрешить внедрение "заголовка". Именованные слоты могут отображаться просто путем "отражения" переменной, которая соответствует их имени:
Теперь мы можем внедрить контент в именованный слот, используя директиву @slot . Любой контент, не входящий в директиву @slot , будет передан компоненту в переменной $slot :
Передача дополнительных данных компоненту
Иногда вам может потребоваться передать дополнительные данные компоненту. Для этой цели вы можете передать массив данных в качестве второго аргумента директиве @component . Все данные будут доступны для шаблона компонента как переменные:
Алиасы компонентов
Если компонент Blade хранится глубоко в подпапках (например, resources/views/components/alert.blade.php ), то чтобы не писать каждый раз директиву и полный путь до шаблона ( components.alert ), вы можете определить алиас. Это можно сделать в методе boot сервис-провайдера AppServiceProvider :
Теперь в шаблонах вы можете писать кратко:
Или вы можете опустить параметры, если компонент не содержит дополнительных слотов:
Переменная Loop
При работе с циклами внутри цикла будет доступна переменная $loop . Эта переменная предоставляет доступ к некоторым полезным данным, например, текущий индекс цикла, или находитесь ли вы на первой или последней итерации цикла:
Если вы во вложенном цикле, вы можете обратиться к переменной $loop родительского цикла через свойство parent :
Переменная $loop одержит также множество других полезных свойств:
Свойство | Описание |
---|---|
$loop->index | Индекс текущей итерации цикла (начинается с 0). |
$loop->iteration | Текущая итерация цикла (начинается с 1). |
$loop->remaining | Число оставшихся итераций цикла. |
$loop->count | Общее число элементов итерируемого массива. |
$loop->first | Первая ли это итерация цикла. |
$loop->last | Последняя ли это итерация цикла. |
$loop->depth | Уровень вложенности текущего цикла. |
$loop->parent | Переменная loop родительского цикла, для вложенного цикла. |
Вывод переменных
Отрисовка шаблонов для коллекций
Вы можете комбинировать циклы и включения в одной строке при помощи Blade-директивы @each :
Первый аргумент — часть шаблона, которую надо отрисовать для каждого элемента массива или коллекции. Второй аргумент — массив или коллекция для перебора, а третий — имя переменной, которое будет назначено для текущей итерации в шаблоне. Например, если вы перебираете массив jobs , то скорее всего захотите обращаться к каждому элементу как к переменной job внутри вашей части шаблона. Ключ для текущей итерации будет доступен в виде переменной key в вашей части шаблона.
Вы также можете передать четвёртый аргумент в директиву @each . Этот аргумент определяет шаблон, который будет отрисовано, если данный массив пуст.
Наследование макета
При определении дочернего шаблона используйте Blade-директиву @extends для указания макета, который должен быть "унаследован" дочерним шаблоном. Шаблоны, которые наследуют макет Blade, могут внедрять содержимое в секции макета с помощью директив @section . Запомните, как видно из приведённого выше примера, содержимое этих секций будет отображено в макете при помощи @yield :
В этом примере секция sidebar использует директиву @parent для дополнения (а не перезаписи) содержимого к боковой панели макета. Директива @parent будет заменена содержимым макета при отрисовке шаблона.
В отличие от предыдущего примера, секция sidebar заканчивается на @endsection вместо @show . Директива @endsection будет только определять секцию, в то время как @show будет определять и немедленно вставлять секцию
Blade-шаблоны могут быть возвращены из роутов при помощи глобального хелпера view :
Оператор If
Вы можете конструировать оператор if при помощи директив @if , @elseif , @else и @endif . Эти директивы работают идентично своим PHP-прообразам:
Для удобства Blade предоставляет и директиву @unless :
В дополнение к обычным директивам, которые мы уже обсуждали, можно использовать и директивы @isset и @empty в виде удобных сокращений для их соответствующих PHP-функций:
Директивы аутентификации
Директивы @auth и @guest определяют видимость контента для залогиненного пользователя и незалогиненного.
Вы можете указать гвард аутентификации, который надо проверять при использовании директив:
Директивы работы с секциями
Узнать, содержит ли заданная секция какой-то контент (т.е. существует) можно при помощи директивы @hasSection
Внедрение сервисов
Директива @inject служит для извлечения сервиса из сервис-контейнера Laravel. Первый аргумент, передаваемый в @inject , это имя переменной, в которую будет помещён сервис. А второй аргумент — имя класса или интерфейса сервиса, который вы хотите извлечь:
Указание метода отправки формы
Чтобы указать метод отправки формы PUT , PATCH и DELETE нужно, чтобы в форме было невидимое поле с именем _method . Это поле может быть сформировано при помощи директивы @method :
Наследование макета
При определении дочернего шаблона используйте Blade-директиву @extends для указания макета, который должен быть "унаследован" дочерним шаблоном. Шаблоны, которые наследуют макет Blade, могут внедрять содержимое в секции макета с помощью директив @section . Запомните, как видно из приведённого выше примера, содержимое этих секций будет отображено в макете при помощи @yield :
В этом примере секция sidebar использует директиву @parent для дополнения (а не перезаписи) содержимого к боковой панели макета. Директива @parent будет заменена содержимым макета при отрисовке шаблона.
В отличие от предыдущего примера (листинг кода app.blade.php ), тут секция sidebar заканчивается директивой @endsection , а не @show . Директива @endsection служит только для определения секции, в то время как @show обозначает окончание секции и немедленную отрисовку в yield
Директива yield может принимать дефолтное значение в качестве второго аргумента. Это значение отрисовывается, если секция, которая должна располагаться на этом месте, не определена.
Blade-шаблоны могут быть возвращены из роутов при помощи глобального хелпера view :
Включение подшаблонов
Blade-директива @include позволяет вам включать Blade-представление в другое представление. Все переменные, доступные родительскому представлению, будут доступны и включаемому представлению:
Хотя включаемое представление унаследует все данные, доступные родительскому представлению, вы также можете передать в него массив дополнительных данных:
Само собой, если вы попробуете сделать PHP @include представления, которого не существует, то Laravel выдаст ошибку. Если вы хотите включить представление, которого может не существовать, вам надо использовать директиву PHP @ includeIf :
Вам следует избегать использования констант __DIR__ и __FILE__ в ваших Blade-представлениях, поскольку они будут ссылаться на расположение кешированных, скомпилированных представлений.
CSRF-поле
В каждой форме для предотвращения CSRF-аттак должно быть поле с CSRF токеном. Это поле может быть сформировано при помощи директивы csrf :
Отображение данных
Вы можете отобразить данные, переданные в ваши Blade-шаблоны, обернув переменную в фигурные скобки. Например, для такого роута:
Вы можете отобразить содержимое переменной name вот так:
Конечно, вы не ограничены отображением только содержимого переменных, передаваемых в шаблон. Вы также можете выводить результаты любых PHP-функций. На самом деле, вы можете поместить любой необходимый PHP-код в оператор вывода Blade:
Blade-оператор > автоматически отправляется через PHP-функцию htmlspecialchars для предотвращения XSS-атак.
Вывод неэкранированных данных
По умолчанию Blade-оператор > автоматически отправляется через PHP-функцию htmlspecialchars для предотвращения XSS-атак. Если вы не хотите экранировать данные, используйте такой синтаксис:
Будьте очень осторожны и экранируйте переменные, которые содержат ввод от пользователя. Всегда используйте экранирование синтаксисом с двойными скобками, чтобы предотвратить XSS-атаки при отображении предоставленных пользователем данных.
Рендеринг JSON
Иногда вам может понадобиться передать в шаблон JSON для инициализации джаваскрипт-переменных. Например:
Вместо вызова json_encode можно использовать директиву @json . Аргументы полностью идентичны php-функции json_encode :
Вы должны использовать @json только для передачи существующих переменных, в которых содержится массив. Сложные выражения в аргументе могут вызывать ошибки рендеринга.
При помощи директивы @json удобно передавать значения из php-переменных в vue-компоненты или в data-* аттрибуты
Для передачи аттрибутов в @json используйте обрамление одинарными кавычками.
Экранирование вывода
By default, Blade (and the Laravel e helper) will double encode HTML entities. If you would like to disable double encoding, call the Blade::withoutDoubleEncoding method from the boot method of your AppServiceProvider :
По умолчанию Blade (и хелпер e ) экранируют вывод, переводя управляющие HTML-последовательности в безопасный текст. Чтобы запретить это поведение используйте Blade::withoutDoubleEncoding в методе boot сервис-провайдера AppServiceProvider .
Комментарии
Blade также позволяет вам определить комментарии в ваших представлениях. Но в отличие от HTML-комментариев, Blade-комментарии не включаются в HTML-код, возвращаемый вашим приложением:
В некоторых случаях бывает полезно встроить PHP-код в ваши представления. Вы можете использовать Blade-директиву PHP @ php для выполнения блока чистого PHP в вашем шаблоне:
Несмотря на то, что в Blade есть эта возможность, её частое использование может быть сигналом того, что у вас слишком много логики, встроенной в шаблон.
Управляющие конструкции
В дополнение к наследованию шаблонов и отображению данных Blade предоставляет удобные сокращения для распространенных управляющих конструкций PHP, таких как условные операторы и циклы. Эти сокращения обеспечивают очень чистый и краткий способ работы с управляющими конструкциями PHP и при этом остаются очень похожими на свои PHP-прообразы.
Оператор If
Вы можете конструировать оператор PHP if при помощи директив PHP @if , PHP @elseif , PHP @else и PHP @endif . Эти директивы работают идентично своим PHP-прообразам:
Для удобства Blade предоставляет и директиву PHP @ unless :
Также вы можете определить, есть ли содержимое в данной секции макета, с помощью директивы PHP @ hasSection :
Наследование шаблонов
Читайте также: