kmklabs/xbt

0.2.0 2017-09-18 07:44 UTC

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代码。