如何在不使用刀片的情况下构建视图层次结构?什么是刀片指令的纯PHP对应物(i,e @section
,@extend
等)?
也许,类似于<?php extend('foo') ?>
在Phalcon框架中,虽然它有自己的模板引擎(Volt),但它的所有模板引擎也可以在pure PHP syntax中使用。
答案 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>
在您的文件中,而不是使用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
也一样。
答案 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。