模板继承和没有Blade语法的部分

时间:2015-08-30 10:37:56

标签: php templates laravel laravel-5 blade

如何在不使用刀片的情况下构建视图层次结构?什么是刀片指令的纯PHP对应物(i,e @section@extend等)?

也许,类似于<?php extend('foo') ?>

在Phalcon框架中,虽然它有自己的模板引擎(Volt),但它的所有模板引擎也可以在pure PHP syntax中使用。

5 个答案:

答案 0 :(得分:7)

由于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'); ?>

答案 1 :(得分:6)

要以纯PHP方式进行此操作,您必须查看storage/framework/cache/views并查看其中发生的情况。基本上,Blade 编译到PHP代码(而不是使用@并使用正确的函数调用)。

我能想到的一种方式是:

在您使用yield 的模板中

<!-- template.php -->
<div class="container">
    <!-- instead of using yield('container') -->
    <?php echo "_yield:container"; ?>
</div>

在您的文件中,而不是使用sectionstop

<!-- 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是如何完成的。 ifwhile也一样。

答案 2 :(得分:1)

与Blade相当的纯PHP是将代码分割为页眉和页脚等部分(例如),然后在页面中使用require将这些部分混合到相应的位置。

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

我没有想到的纯PHP函数,从主模板扩展页面,你使用yield指令。

答案 3 :(得分:-1)

Blade每次都编译成PHP,它编译的内容存储在storage/framework/views/*

以下链接是刀片可以编译的所有内容的列表,您应该能够从中提取一些知识:

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

答案 4 :(得分:-1)

两种刀片指令都不是纯粹的&#39; PHP功能。 PHP函数不能以@开头,所有刀片指令都可以。简而言之,刀片指令是PHP内置函数或控制结构的快捷方式或同义词。

您可以自由使用任何其他模板引擎 - 它不一定是Blade。刀片是内置的,但你并没有锁定它。只需安装供应商软件包或制作自己的软件包,然后使用响应返回HTML输出,而不是使用View facade。