Наследование шаблонов и разделы без синтаксиса Blade

Как структурировать иерархию представлений без использования блейда? Каковы чистые php-аналоги блейд-директив (т.е. @section, @extend и т. д.)?

Возможно, что-то похожее на <?php extend('foo') ?>

В среде Phalcon, несмотря на наличие собственного механизма шаблонов (Volt), все механизма шаблонов также доступен в чистом синтаксисе PHP.


person PHPst    schedule 30.08.2015    source источник
comment
Я должен спросить - почему??? Я надеюсь, вы не думаете, что это для производительности, но выигрыша не будет (поскольку Blade компилируется в чистый php как кешированные файлы просмотра).   -  person Laurence    schedule 07.09.2015
comment
@TheShiftExchange Да, я знаю это. Наши представления уже доступны из предыдущей версии. Кроме того, синтаксис блейда не намного лучше, чем чистый PHP, и усложняет отладку. Когда возникает исключение, сообщение об ошибке указывает на скомпилированный файл, а не на фактический шаблон.   -  person PHPst    schedule 07.09.2015


Ответы (5)


Поскольку директивы Blade просто компилируются в обычный PHP, технически возможно использовать функции структурирования представлений без фактического использования Blade. Я не думаю, что это очень красиво, и лично я бы дважды подумал об этом решении.

Вы можете найти весь код PHP, в который скомпилирован Blade, в этом классе:

Illuminate\View\Compilers\BladeCompiler

Вот некоторые из них:

@section('content')

<?php $__env->startSection('content'); ?>

@endsection

<?php $__env->stopSection(); ?>

@extends('layout')

Это немного сложно. Обычно Blade компилирует его, а затем добавляет в переменную нижнего колонтитула, которая печатается внизу. Поэтому вместо того, чтобы помещать его вверху (как в случае с @extends), вы должны поместить это в конец вашего представления:

<?php echo $__env->make('layout', array_except(get_defined_vars(), array('__data', '__path')))->render(); ?>

@yield('content')

<?php echo $__env->yieldContent('content'); ?>
person lukasgeiter    schedule 04.09.2015
comment
Спасибо, я надеюсь, что есть более чистые альтернативы. - person PHPst; 07.09.2015
comment
Есть более чистая альтернатива: Blade (или любая другая система шаблонов) - person lukasgeiter; 07.09.2015
comment
Сделать эти функции доступными в представлениях - более чистый способ, и это действительно мой вопрос. - person PHPst; 07.09.2015
comment
@lukasgeiter - Некоторые могут не подумать о том, чтобы добавить механизм шаблонов поверх другого механизма шаблонов, чтобы сделать его чище. - person Dissident Rage; 26.09.2016

Чтобы представить это на чистом 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.

person Alex    schedule 04.09.2015

Чистый PHP-эквивалент Blade состоит в том, чтобы разделить ваш код на разделы, такие как верхний и нижний колонтитулы (например), а затем использовать require на вашей странице, чтобы смешать эти разделы в соответствующем месте.

<?php
    require("template/header.php");
    // Here goes the body code
    require("template/footer.php");
?>

Я не могу придумать чистых PHP-функций для расширения страницы из основного шаблона, которые вы делаете с помощью директивы yield.

person Yoandro Gonzalez    schedule 04.09.2015

Blade каждый раз компилируется в PHP, а то, что он компилирует, сохраняется в storage/framework/views/*

Следующая ссылка представляет собой список всего, что может скомпилировать Blade, вы сможете извлечь из этого некоторые знания:

https://github.com/illuminate/view/blob/master/Compilers/BladeCompiler.php

Общая идея для большинства движков шаблонов заключается в том, что они структурируют ваш код следующим образом:

if ($condition):
  // do stuff
endif;

while ($condition):
  // do stuff
endwhile;

foreach ($array as $key => $value):
  // do stuff
endforeach;

Для получения дополнительной информации см. https://secure.php.net/manual/en/control-structures.alternative-syntax.php

person Zarthus    schedule 30.08.2015

Ни одна из блейд-директив не является «чистой» функцией PHP. PHP-функции не могут начинаться с @, как и все блейд-директивы. Короче говоря, блейд-директивы — это ярлыки или синонимы встроенных функций или управляющих структур PHP.

Вы можете использовать любой другой механизм шаблонов — это не обязательно должен быть Blade. Blade встроен, но вы не привязаны к нему. Просто установите пакет поставщика или создайте свой собственный и верните вывод HTML с ответом вместо использования фасада просмотра.

person Denis Mysenko    schedule 30.08.2015