Наследование шаблонов и разделы без синтаксиса Blade
Автор вопроса: PHPstОтветов: 5
Как структурировать иерархию представлений без использования блейда? Каковы чистые php-аналоги блейд-директив (т.е. @section, @extend и т. д.)?
Возможно, что-то похожее на <?php extend('foo') ?>
В среде Phalcon, несмотря на наличие собственного механизма шаблонов (Volt), все механизма шаблонов также доступен в чистом синтаксисе PHP.
Я должен спросить - почему??? Я надеюсь, вы не думаете, что это для производительности, но выигрыша не будет (поскольку Blade компилируется в чистый php как кешированные файлы просмотра). Laurence 07.09.2015
@TheShiftExchange Да, я знаю это. Наши представления уже доступны из предыдущей версии. Кроме того, синтаксис блейда не намного лучше, чем чистый PHP, и усложняет отладку. Когда возникает исключение, сообщение об ошибке указывает на скомпилированный файл, а не на фактический шаблон. PHPst 07.09.2015
Поскольку директивы Blade просто компилируются в обычный PHP, технически возможно использовать функции структурирования представлений без фактического использования Blade. Я не думаю, что это очень красиво, и лично я бы дважды подумал об этом решении.
Вы можете найти весь код PHP, в который скомпилирован Blade, в этом классе:
Это немного сложно. Обычно Blade компилирует его, а затем добавляет в переменную нижнего колонтитула, которая печатается внизу. Поэтому вместо того, чтобы помещать его вверху (как в случае с @extends), вы должны поместить это в конец вашего представления:
Чтобы представить это на чистом PHP, вам нужно проверить storage/framework/cache/views и посмотреть, что там происходит. По сути, это то, что Blade компилирует в код PHP (вместо использования @ и с правильными вызовами функций).
Я могу думать так:
В вашем шаблоне, где вы используете yield:
<!-- template.php -->
<div class="container">
<!-- instead of using yield('container') -->
<?php echo "_yield:container"; ?>
</div>
В вашем файле вместо использования section и stop
<!-- view.php -->
<!-- instead of using extend('template') -->
<?php $templatePath = 'template.php'; ?>
<?php $sections = []; ?>
<!-- instead of using section('container') -->
<?php $currentSectionName = 'container'; ob_start(); ?>
<p>This will be in my container div</p>
<!-- instead of using stop -->
<?php
// get the current html
$sections["_yield:".$currentSectionName] = ob_get_contents();
ob_end_clean();
ob_start();
require($templateName);
$template = ob_get_contents();
ob_end_clean();
echo str_replace($template,array_keys($sections),array_values($sections));
?>
Конечно, такой подход в лучшем случае упрощен. Предоставленный код не предназначен для копирования и вставки, он больше похож на концепцию.
Все остальное просто:
@foreach($arr as $k=>$v)
...
@endforeach
переводится как
<?php foreach($arr as $k=>$v) : ?>
...
<?php endforeach; ?>
Именно так это делает BladeCompiler. То же самое с if и while.
Ответ 3 · рейтинг 1 · Yoandro Gonzalez
Чистый PHP-эквивалент Blade состоит в том, чтобы разделить ваш код на разделы, такие как верхний и нижний колонтитулы (например), а затем использовать require на вашей странице, чтобы смешать эти разделы в соответствующем месте.
<?php
require("template/header.php");
// Here goes the body code
require("template/footer.php");
?>
Я не могу придумать чистых PHP-функций для расширения страницы из основного шаблона, которые вы делаете с помощью директивы yield.
Ответ 4 · рейтинг -1 · Zarthus
Blade каждый раз компилируется в PHP, а то, что он компилирует, сохраняется в storage/framework/views/*
Следующая ссылка представляет собой список всего, что может скомпилировать Blade, вы сможете извлечь из этого некоторые знания:
Ни одна из блейд-директив не является "чистой" функцией PHP. PHP-функции не могут начинаться с @, как и все блейд-директивы. Короче говоря, блейд-директивы - это ярлыки или синонимы встроенных функций или управляющих структур PHP.
Вы можете использовать любой другой механизм шаблонов - это не обязательно должен быть Blade. Blade встроен, но вы не привязаны к нему. Просто установите пакет поставщика или создайте свой собственный и верните вывод HTML с ответом вместо использования фасада просмотра.