joanrodas/plubo-template-engine

基于BladeOne的WordPress Blade模板引擎

dev-master 2024-06-04 14:40 UTC

This package is auto-updated.

Last update: 2024-09-04 15:10:59 UTC


README

Logo

BladeOne Blade模板引擎

BladeOne是Blade模板引擎的独立版本,使用单个PHP文件,可以移植并在不同的项目中使用。它允许你在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的默认模板系统(自从多年前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'...)}}

安装(选择以下之一)

  1. 手动下载文件,然后解压缩(使用WinRAR、7zip或其他任何程序) https://github.com/EFTEC/BladeOne/archive/master.zip
  2. git clone https://github.com/EFTEC/BladeOne(它不包含示例)
  3. Composer。见使用
  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。所以视图文件夹中应该有一个名为<强>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

自定义控件。

有多种方法可以创建新的控件(标签)

扩展库(可选)

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 创建“编译”和“模板”文件夹
  • -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主要是一个原创作品)