eftec/bladeone

Blade 模板引擎的独立版本,使用单个 PHP 文件,可在 Laravel 中使用

4.13 2024-03-26 21:35 UTC

README

Logo

BladeOne Blade 模板引擎

BladeOne 是一个使用单个 PHP 文件和可移植的 Blade 模板引擎独立版本,可以在不同的项目中使用。它允许你在 Laravel 之外使用 blade 模板。

Packagist Total Downloads Maintenance composer php php php CocoaPods

不支持动态 blade 组件(原因:性能目的)和针对 blade 的自定义功能,但其他一切均受支持。

与 Twig 的比较

(预告) Twig 更慢。😊

测试了什么?测试了两个最常用的功能:使用包含 1000 个元素的数组进行了多次测试。

与 Twig 的比较

关于提问、报告、疑虑或建议的注意事项

✔ 如果你想要发起一个询问,有疑问,或者你发现了一个错误,那么你可以打开一个 问题
请不要直接给我发邮件(或者发送私信)来提问或报告。
此外,如果你想要重新打开一个报告,那么你可以这样做。
我会尽量回答每一个问题(在我有限的时间范围内)。

一些示例

手册

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'...)}}

安装(选择以下之一)

  1. 手动下载文件并解压(使用WinRAR、7zip或其他程序) https://github.com/EFTEC/BladeOne/archive/master.zip
  2. git clone https://github.com/EFTEC/BladeOne(不包括示例)
  3. Composer. See usage
  4. 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

自定义控件。

创建新控件(标签)有多种方法。

扩展库(可选)

BladeOneCache 文档

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)

docs/cli.png

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主要是原创作品)