kmklabs / xbt
XBT
0.2.0
2017-09-18 07:44 UTC
Requires
- php: >=5.5.9
- ext-xhp: *
- illuminate/view: ~5.1
Requires (Dev)
- mockery/mockery: 0.9.*
- phpunit/phpunit: 5.1.*
This package is not auto-updated.
Last update: 2024-09-28 20:09:00 UTC
README
简介
这是一个简单的库,可以将XHP模板表达式编译成一个普通的Hack类。我们这样做是因为我们需要在XHP中实现模板继承和包含。
功能
- 模板块/包含
- 从外部访问内部模板
- 模板继承,例如
<xbt:template extends="path.dot.base">
,它将使用path/dot/base.xbt.php
- 使用
<xbt:parent />
访问父块
示例
假设我们有一个名为 xbt
的模板,命名为 template.xbt.php
<xbt:template doctype="true">
<html>
<body>
<h1>This is a header</h1>
<xbt:block name="main">
<p>This is inside a block</p>
<xbt:block name="submain">
<p>This is a block inside a block</p>
</xbt:block>
</xbt:block>
<p>This is a simple footer</p>
</body>
</html>
</xbt:template>
并且有一个视图文件名为 welcome.xbt.php
<xbt:template base="template">
<xbt:block name="main">
<p>Welcome Home</p>
</xbt:block>
</xbt:template>
加载文件,并使用这个库,我们可以将模板转换成XHP类
$contents = file_get_contents("template.xbt.php");
$tokenizer = new Tokenizer($contents);
$tokenStream = $tokenizer->tokenize();
$parser = new Parser($tokenStream);
$result = $parser->parse();
$result
应该看起来像这样
<?php
class __xbt_4bc492834a61e30d17d158c6a052837584b1db90 extends App\Publishing\Lib\Xbt\Runtime
{
public function render()
{
return <x:frag>
<h1>This is a header</h1>
{$this->block_main()}
<p>This is a simple footer</p>
</x:frag>;
}
public function block_main()
{
return <x:frag>
<p>This is inside a block</p>
{$this->block_submain()}
</x:frag>;
}
public function block_submain()
{
return <x:frag>
<p>This is a block inside a block</p>
</x:frag>;
}
}
Laravel 绑定和配置
将 Xbt\LaravelServiceProvider
包含到您的项目中。编译后的xhp类在 config('view.compiled')
中,从这些类编译的Laravel视图在 config('view.xbt_cache')
中。
过程
File -> Tokenizer -> TokenStream -> Parser -> Node -> Xhp
Tokenizer
将模板标记化成 TokenStream
。我们将 TokenStream
传递给 Parser
,并调用 parse
方法以获取 Template
节点,这是给定模板的最高级别表示节点。
Node
是PHP/Hack中xhp类的抽象。解析过程将模板文件转换为 Node
,然后再写入文件。在 Template
中的 compile
方法将输出XHP代码。