emsifa / power-stub
一个支持控制语句和循环而不破坏缩进的占位符引擎。
Requires
- php: ^7.1
Requires (Dev)
- phpunit/phpunit: ^7
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2024-09-14 15:12:59 UTC
README
Power Stub 是一个 占位符引擎,支持控制语句、循环和几个其他特性,使您更容易从占位符文件生成代码。
占位符文件是一个包含多个参数的原始代码文件,这些参数将被特定文本替换。
我们使用“占位符引擎”这个术语,因为 Power Stub 不仅能够用给定文本替换参数,还支持控制语句(if-elseif-else-endif
)、循环(foreach-endforeach
、while-endwhile
)等。它就像一个 模板引擎,同时保持您的缩进正确,因此生成的代码将保持整洁。
理解问题
在常见的模板引擎,如 Blade、Twig 等,它们会将您的视图文件渲染成下面的 PHP 代码
<div>
<?php foreach($a as $b): ?>
<p>
lorem ipsum <?= $b ?>
</p>
<?php endforeach; ?>
</div>
当我们用 $a = [1,2,3]
渲染该文件时,结果会像这样混乱
<div> <p> lorem ipsum 1 </p> <p> lorem ipsum 2 </p> <p> lorem ipsum 3 </p> </div>
这是可以的,因为模板引擎的结果是针对浏览器,浏览器不关心缩进。
但如果我们要制作代码生成器,这是不可接受的。
所以使用 Power Stub,我们的占位符文件会看起来像这样
<div>
|# foreach($a as $b) #|
<p>
lorem ipsum [# $b #]
</p>
|# endforeach #|
</div>
当我们用 $a = [1,2,3]
渲染这个占位符时,结果会像这样
<div> <p> lorem ipsum 1 </p> <p> lorem ipsum 2 </p> <p> lorem ipsum 3 </p> </div>
现在大家都很开心 :D
其他特性
包含
我们还处理了包含函数,以保持相对于定义的缩进。例如,您有两个占位符文件如下
main.js.stub
import something from 'something';
[# include("timeout.js", ['message' => 'first', 'delay' => 1000]) #]
something.on('event', () => {
something.asyncStuff(() => {
// timeout 2 seconds
[# include("timeout.js", ['message' => 'second', 'delay' => 2000]) #]
});
});
timeout.js.stub
setTimeout(() => {
console.log("[# $message #]");
}, [# $delay #]);
如果我们渲染 main.js.stub
,结果会像这样
import something from 'something'; setTimeout(() => { console.log("first"); }, 1000); something.on('event', () => { something.asyncStuff(() => { // timeout 2 seconds setTimeout(() => { console.log("second"); }, 2000); }); });
开始使用
Power Stub 仍然是实验性的。我们已经进行了一些简单的测试。您可以使用它,但可能会有一些破坏性变更。
要求
- PHP >= 7.1
安装
在您想放置代码的目录中创建一个目录。
使用您的 cmd/终端进入该目录,并运行下面的 composer 命令
composer require emsifa/power-stub:dev-master
准备
在我们开始使用 Power Stub 之前,我们需要创建两个目录。
您可以使用以下命令
mkdir stubs
mkdir compiled
渲染
首先,让我们创建第一个占位符。在我们的 stubs
目录中创建文件 app.js.stub
。
在这个例子中,我们将创建一个包含动态路由的 express 应用占位符。
const express = require('express');
const app = express();
|# foreach($routes as $r) #|
app.[# strtolower($r['method']) #]('[# $r['path'] #]', function (req, res) {
return res.send('OK');
});
|# endforeach #|
app.listen(3000);
现在让我们创建一个 PHP 脚本来渲染这个占位符。创建一个名为 render.php
的文件。
<?php require("vendor/autoload.php"); $powerStub = new Factory( __DIR__.'/stubs', // our stubs directory __DIR__.'/compiled', // compiled directory 'stub' // extension (optional, default 'stub') ); // Render app.js.stub $rendered = $powerStub->render("app.js", [ 'routes' => [ [ 'path' => '/', 'method' => 'GET', ], [ 'path' => '/login', 'method' => 'POST', ], [ 'path' => '/register', 'method' => 'POST', ] ] ]); echo $rendered;
现在,当您调用 php render.php
时,输出将看起来像这样
const express = require('express'); const app = express(); app.get('/', function (req, res) { return res.send('OK'); }); app.post('/login', function (req, res) { return res.send('OK'); }); app.register('/register', function (req, res) { return res.send('OK'); }); app.listen(3000);