Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: PHPstОтветов: 5

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

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

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

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

phplaravellaravel-5templatesblade

Ответы

Ответ 1 · рейтинг 7 · lukasgeiter

Поскольку директивы 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'); ?>

Ответ 2 · рейтинг 6 · Alex

Чтобы представить это на чистом 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, вы сможете извлечь из этого некоторые знания:

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

Ответ 5 · рейтинг -1 · Denis Mysenko

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы