eftec / bladeone
Blade 模板引擎的独立版本,使用单个 PHP 文件,可在 Laravel 中使用
Requires
- php: >=7.4
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^8.5.23
Suggests
- ext-mbstring: This extension is used if it's active
- eftec/bladeonehtml: Extension to create forms
- dev-master
- 4.13
- 4.12
- 4.11
- 4.10
- 4.9
- 4.8.2
- 4.8
- 4.7.1
- 4.7
- 4.6
- 4.5.5
- 4.5.4
- 4.5.3
- 4.5.2
- 4.5.1
- 4.5
- 4.4.2
- 4.4.1
- 4.4
- 4.3
- 4.2
- 4.1
- 4.0
- 3.52
- 3.51
- 3.50
- 3.49.1
- 3.49
- 3.48
- 3.47.3
- 3.47.2
- 3.47.1
- 3.47
- 3.46.3
- 3.46.2
- 3.46.1
- 3.46
- 3.45.1
- 3.45
- 3.44.3
- 3.44.2
- 3.44.1
- 3.44
- 3.43
- 3.42
- 3.41.1
- 3.41
- 3.40
- 3.39
- 3.38.1
- 3.38
- 3.37
- 3.36.2
- 3.36.1
- 3.36
- 3.35
- 3.34
- 3.33
- 3.32
- 3.31
- 3.30
- 3.29
- 3.28
- 3.27
- 3.26
- 3.25
- 3.24
- 3.23
- 3.22
- 3.21
- 3.20
- 3.19
- 3.18
- 3.17
- 3.16
- 3.15
- 3.14
- 3.13
- 3.12
- 3.11
- 3.10
- 3.9
- 3.8
- 3.7.1
- 3.7
- 3.6
- 3.5
- 3.4
- 3.3
- 3.2
- 3.1
- 3.0
- 2.4
- 2.3.5
- 2.3.4
- 2.3.3
- 2.3
- 1.9
- 1.8
- 1.6
- 1.4
- 1.3
- 1.2
- 1.0
- 0.2Beta
- 0.1beta
- dev-example
This package is auto-updated.
Last update: 2024-09-03 21:40:15 UTC
README
BladeOne Blade 模板引擎
BladeOne 是一个使用单个 PHP 文件和可移植的 Blade 模板引擎独立版本,可以在不同的项目中使用。它允许你在 Laravel 之外使用 blade 模板。
不支持动态 blade 组件(原因:性能目的)和针对 blade 的自定义功能,但其他一切均受支持。
与 Twig 的比较
(预告) Twig 更慢。😊
测试了什么?测试了两个最常用的功能:使用包含 1000 个元素的数组进行了多次测试。
关于提问、报告、疑虑或建议的注意事项
✔ 如果你想要发起一个询问,有疑问,或者你发现了一个错误,那么你可以打开一个 问题。
请不要直接给我发邮件(或者发送私信)来提问或报告。
此外,如果你想要重新打开一个报告,那么你可以这样做。
我会尽量回答每一个问题(在我有限的时间范围内)。
一些示例
手册
- BladeOne 手册
- 模板标签(视图)
- 自定义控制
- 类的方 法
- 在视图之前注入逻辑(composer)
- 扩展类
- 使用 BladeOne 与 YAF Yet Another Framework
- 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 的既定标准模板系统(自从 years ago Smarty 就已经日落西山了),因此,如果我们可以在不使用 Laravel 的情况下使用它,那么这对许多项目来说是一个很大的优势。事实上,在理论上,它甚至可以与 Laravel 一起使用。存在不同的 Blade 模板版本,可以在不使用 Laravel 的情况下运行,但大多数需要 50 个或更多的文件,这些模板增加了新的复杂性层次,所以它们不是在移除 Laravel 而是在隐藏
- 更多的文件要管理。
- 对当前项目的更改(如果你想要将模板集成到一个现有的项目中)
- 与其他项目之间的不兼容性。
- 速度(如果你的服务器没有使用 op-cache)
- 原始 Blade 中的大部分代码都是为了未来使用而准备的,包括使用不同模板引擎的机会。
- 一些 Laravel 留存代码。
本项目使用一个名为BladeOne.php的单个文件和一个名为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. See usage
- 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
。因此,在views文件夹中应该存在一个名为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的现有实例注入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 创建 "compile" 和 "template" 文件夹
- -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 Team(此代码基于并受到Laravel团队的启发,但BladeOne主要是原创作品)