joanrodas / plubo-template-engine
基于BladeOne的WordPress Blade模板引擎
Requires
- php: >=7.4
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^8.5.38
Suggests
- ext-mbstring: This extension is used if it's active
This package is auto-updated.
Last update: 2024-09-04 15:10:59 UTC
README
BladeOne Blade模板引擎
BladeOne是Blade模板引擎的独立版本,使用单个PHP文件,可以移植并在不同的项目中使用。它允许你在Laravel之外使用blade模板。
不支持动态blade组件(原因:性能目的),但支持针对blade的定制功能和所有其他功能。
与Twig的比较
(剧透)Twig更慢。😊
测试了哪些内容?测试了两个最常用的功能:使用包含1000个元素的数组进行了多次测试。
关于提问、报告、疑问或建议的注意事项
✔ 如果你想提出一个问题、有疑问或发现一个错误,你可以打开一个问题。
请勿直接通过电子邮件(或发私信)向我提问或报告。
此外,如果你想重新打开一个报告,你也可以这样做。
我将尽力回答每一个问题(在我的有限时间内)。
一些示例
手册
- BladeOne 手册
- 模板标签(视图)
- 自定义控件
- 类的方法
- 在视图之前注入逻辑(作曲家)
- 扩展类
- 在YAF Yet Another Framework中使用BladeOne
- Blade和BladeOne之间的区别
- 与Twig的比较(2020年5月)
- 变更日志
- 2.x和3.0之间的变化以及TODO
- 代码保护(Sourceguardian和类似产品)
PHP 5.x支持?
这个版本不再支持PHP 5.x。然而,你可以使用旧版本,该版本与PHP 5.6及更高版本完全兼容。
Laravel blade教程
你可以在示例文件夹中找到一些教程和示例。
你也可以查看Wiki。
关于本版本
按照标准,原始Blade库是Laravel(Illuminate组件)的一部分,要使用此模板库,您需要安装Laravel和Illuminate-view组件。Blade的语法非常简洁和明亮。它基于C# Razor(另一个C#模板库)。它开始被视为许多PHP的默认模板系统(自从多年前Smarty走下坡路以来),因此,如果我们能够在Laravel之外使用它,那么这对许多项目来说是一个很大的加分项。实际上,在理论上,它甚至可以与Laravel一起使用。存在不同的Blade模板版本,可以在不使用Laravel的情况下运行,但大多数需要50个或更多的文件,并且这些模板增加了新的复杂性层次,因此它们并没有移除Laravel,而是在隐藏。
- 需要管理更多的文件。
- 对当前项目的更改(如果你想要将模板集成到一个现有的项目中)
- 与其他项目之间的不兼容性。
- 速度慢(如果你的服务器没有使用op-cache)
- 原始Blade中的大部分代码都是为了将来使用而准备的,包括使用不同模板引擎的机会。
- 一些Laravel遗留代码。
本项目使用一个名为BladeOne.php的单个文件和一个名为BladeOne的单个类。如果您想使用它,则包含它,创建文件夹,就这样!没有更多(甚至没有命名空间)*[]:BladeOne也可以与Laravel或其他任何框架一起使用。毕竟,BladeOne是本地的,所以可以集成到几乎任何项目中。
为什么要用它而不是原生PHP?
关注点分离
假设我们有以下代码
//some PHP code // some HTML code // more PHP code // more HTML code.
这会导致代码混乱。例如,假设我们忽略了更改页面视觉布局。在这种情况下,我们应该更改所有代码,甚至可能破坏部分编程。
相反,使用模板系统的工作方式如下
// some php code ShowTemplate();
我们正在将视觉层与代码层分离。此外,我们可以分配一个非PHP程序员负责编辑模板,而他们不需要接触或了解我们的PHP代码。
安全性
假设我们有以下练习(这是一个示例)
$name=@$_GET['name']; echo "my name is ".$name;
它可以分为两个文件
$name=@$_GET['name']; include "template.php";
// template.php echo "my name is ".$name;
即使是这个简单的例子,也存在被黑客攻击的风险。如何?用户可以通过使用GET变量发送恶意代码,如html或甚至是javascript。第二个文件应如下编写
// template.php echo "my name is ".html_entities($name);
在视觉层(html)的每个部分(用户可以注入恶意代码的地方)都应使用html_entities,这是一项真正繁琐的工作。BladeOne会自动完成。
// template.blade.php My name is {{$name}}
易于使用
BladeOne专注于易于学习的语法和快速编写,同时又能保持PHP的强大功能。
让我们考虑以下模板
<select> <? foreach($countries as $c) { ?> <option value=<? echo html_entities($c->value); ?> > <? echo html_entities($c->text); ?></option> <? } ?> </select>
使用BladeOne,我们可以用以下方式完成同样的操作
<select> @foreach($countries as $c) <option value={{$c->value}} >{{echo html_entities($c->text)}}</option> @nextforeach </select>
如果我们使用.html扩展,甚至可以减少到
@select('id1') @items($countries,'value','text','','') @endselect()
性能
这个库在两个阶段工作。
第一个阶段是在模板第一次被调用时。在这种情况下,模板被编译并存储在一个文件夹中。
第二次调用模板时,它将使用编译后的文件。编译后的文件主要包含原生PHP,所以**性能与原生代码相当**,因为编译版本是PHP。
可扩展性
您可以通过向BladeOne类添加新方法(或扩展)来添加和使用您自己的函数。注意:函数应以“compile”开头。
protected function compileMyFunction($expression) { return $this->phpTag . "echo 'YAY MY FUNCTION IS WORKING'; ?>"; }
以下是在模板中使用的函数的示例
@myFunction('param','param2'...)
或者,如果定义了,BladeOne允许从任何类或方法中运行任意代码。
{{SomeClass::SomeMethod('param','param2'...)}}
安装(选择以下之一)
- 手动下载文件,然后解压缩(使用WinRAR、7zip或其他任何程序) https://github.com/EFTEC/BladeOne/archive/master.zip
- git clone https://github.com/EFTEC/BladeOne(它不包含示例)
- Composer。见使用
- wget https://github.com/EFTEC/BladeOne/archive/master.zip unzip master.zip
使用方法
如果您使用composer,则可以使用以下命令(命令行)添加库
composer require eftec/bladeone
如果您不使用它,则可以下载库并手动包含它。
显式定义
use eftec\bladeone\BladeOne; $views = __DIR__ . '/views'; $cache = __DIR__ . '/cache'; $blade = new BladeOne($views,$cache,BladeOne::MODE_DEBUG); // MODE_DEBUG allows to pinpoint troubles. echo $blade->run("hello",array("variable1"=>"value1")); // it calls /views/hello.blade.php
其中$views
是存储未编译视图(模板)的文件夹。 $cache
是存储编译文件的文件夹。
在这个例子中,BladeOne打开模板<强>hello强>。所以视图文件夹中应该有一个名为<强>hello.blade.php强>的文件
views/hello.blade.php
<h1>Title</h1> {{$variable1}}
隐式定义
在此模式下,它使用文件夹 __DIR__/views
和 __DIR__/compiles
,并使用模式 MODE_AUTO。
use eftec\bladeone\BladeOne; $blade = new BladeOne(); // MODE_DEBUG allows to pinpoint troubles. echo $blade->run("hello",array("variable1"=>"value1")); // it calls /views/hello.blade.php
注入
您可以使用现有的Bladeone实例来注入它。如果没有实例,它将使用默认文件夹创建一个新实例。
$blade=BladeOne::$instance;
echo $blade->run("hello",array("variable1"=>"value1")); // it calls /views/hello.blade.php
流畅
use eftec\bladeone\BladeOne; $blade = new BladeOne(); // MODE_DEBUG allows to pinpoint troubles. echo $blade->setView('hello') // it sets the view to render ->share(array("variable1"=>"value1")) // it sets the variables to sends to the view ->run(); // it calls /views/hello.blade.php
过滤器(管道)
通过向结果添加过滤器,可以修改结果。
假设我们有下一个值 $name='Jack Sparrow'。
$blade=new BladeOne(); $blade->pipeEnable=true; // pipes are disable by default so it must be enable. echo $blade->run('template',['name'=>'Jack Sparrow']);
我们的视图可能如下所示
{{$name}} or {!! $name !!} // Jack Sparrow
如果我们想显示大写的名字怎么办?。
我们可以在代码中这样做 $name=strtoupper('Jack Sparrow')。使用管道,我们可以这样做
{{$name | strtoupper}} // JACK SPARROW
我们还可以添加参数和方法链。
{{$name | strtoupper | substr:0,5}} // JACK
您可以在https://github.com/EFTEC/BladeOne/wiki/Template-Pipes-(Filter)上找到更多信息。
安全(可选)
require "vendor/autoload.php"; Use eftec\bladeone; $views = __DIR__ . '/views'; $cache = __DIR__ . '/cache'; $blade=new bladeone\BladeOne($views,$cache,BladeOne::MODE_AUTO); $blade->setAuth('johndoe','admin'); // where johndoe is an user and admin is the role. The role is optional echo $blade->run("hello",array("variable1"=>"value1"));
如果您使用blade登录,则可以使用标签 @auth/@endauth/@guest/@endguest。
@auth // The user is authenticated... @endauth @guest // The user is not authenticated... @endguest
或者
@auth('admin') // The user is authenticated... @endauth @guest('admin') // The user is not authenticated... @endguest
自定义控件。
有多种方法可以创建新的控件(标签)
扩展库(可选)
https://github.com/eftec/BladeOneHtml
在模板中调用静态方法。
自 3.34 版本起,BladeOne 允许在类中调用静态方法。
假设我们有一个具有命名空间 \namespace1\namespace2 的类。
namespace namespace1\namespace2 { class SomeClass { public static function Method($arg='') { return "hi world"; } } }
方法 1 PHP 风格
我们可以在模板中添加一个 "use"。例如
将以下行添加到模板中
@use(\namespace1\namespace2)
并添加以下行到模板中(不同方法)
{{SomeClass::Method()}} {!! SomeClass::Method() !!} @SomeClass::Method()
所有这些方法都是在运行时执行的
方法 2 别名
或者我们可以为每个类定义别名。
PHP 代码
$blade = new BladeOne(); // with the method addAliasClasses $blade->addAliasClasses('SomeClass', '\namespace1\namespace2\SomeClass'); // with the setter setAliasClasses $blade->setAliasClasses(['SomeClass'=>'\namespace1\namespace2\SomeClass']); // or directly in the field $blade->aliasClasses=['SomeClass'=>'\namespace1\namespace2\SomeClass'];
模板
{{SomeClass::Method()}} {!! SomeClass::Method() !!} @SomeClass::Method()
对于全局类,我们不需要别名或use。
命名参数(自 3.38 版本起)
BladeOne 允许命名参数。此功能必须按函数实现。
让我们看看下一个问题
这是旧的库 BladeOneHtml
@select('id1')
@item('0','--Select a country--',"",class='form-control'")
@items($countries,'id','name',"",$countrySelected)
@endselect
这是新的库
@select(id="aaa" value=$selection values=$countries alias=$country) @item(value='aaa' text='-- select a country--') @items( id="chkx" value=$country->id text=$country->name) @endselect
旧的方法 select 只允许有限数量的参数。参数的顺序很重要。
新方法 select 允许添加不同类型的参数
命令行(CLI)
BladeOne(自版本 v4.2)允许通过命令行(CLI)运行一些操作。
如何运行它?
- 转到您的家目录并调用PHP脚本如下
php vendor/bin/bladeonecli # windows/linux/macos # or you could execute the script as: ./vendor/bin/bladeonecli.bat # windows ./vendor/bin/bladeonecli # linux/macos
或根据您的安装更改文件夹。
您可以设置语法如下
- -templatepath(可选)模板路径(视图路径)。
- 例如:'/folder/views' 或 'views'(相对路径)
- -compilepath(可选)编译路径。
- 例如:'/folder/compiles' 或 'compiles'(相对路径)
- -clearcompile 删除编译路径的内容
- -createfolder 创建“编译”和“模板”文件夹
- -check 检查库
清除编译文件夹
php vendor/lib/eftec/bladeone/lib/BladeOne.php -clearcompile
检查文件夹,如果文件夹存在,是否有正确的权限等。
php vendor/lib/eftec/bladeone/lib/BladeOne.php -check
使用自定义编译路径清除编译文件夹的示例
php vendor/lib/eftec/bladeone/lib/BladeOne.php -clearcompile -compilepath mycompile # relative path to the current location php vendor/lib/eftec/bladeone/lib/BladeOne.php -clearcompile -compilepath /var/mycompile # absolute path (Linux/MacOS) php vendor/lib/eftec/bladeone/lib/BladeOne.php -clearcompile -compilepath c:\var\mycompile # absolute path (Windows)
BladeOneHtml
这是 BladeOne 的一个新扩展。它允许轻松且性能接近原生的方式创建HTML组件。
它使用了 BladeOne 的新功能:命名参数
创建选择器的示例
@select(id="aaa" value=$selection values=$countries alias=$country) @item(value='aaa' text='-- select a country--') @items( id="chkx" value=$country->id text=$country->name) @endselect
https://github.com/eftec/BladeOneHtml
您可以下载它或通过Composer添加它
composer require eftec/bladeonehtml
协作
欢迎使用使用、分享、要求更改等。只需在文件中保留版权声明即可。
未来
- Blade 定位器/容器
许可证
MIT许可证。BladeOne (c) 2016-2024 Jorge Patricio Castro Castillo Blade (c) 2012 Laravel团队(本代码基于并受到Laravel团队工作的启发,但BladeOne主要是一个原创作品)