首頁  >  文章  >  後端開發  >  建構PHP框架之建構模版引擎實例

建構PHP框架之建構模版引擎實例

零下一度
零下一度原創
2017-06-26 15:30:581274瀏覽

自从来到新公司就一直很忙,最近这段时间终于稍微闲了一点,赶紧接着写这个系列,感觉再不写就烂尾了。

之前我们说到,拿到{{ $name }}这样一段内容时,我们只需要将它转化成0bbc6416ec6aafbfcc8ee398efef76b2这样,就可以识别了,输出相应的变量值。

那就要需要正则匹配{{ $name }},然后替换掉{{}},分别替换成71c70116f69f10410695d12b088121a9

但是要想到一个问题,如果我在 view 里写了 php 的代码,其中含有{{ $name }},也会被替换。例子如下:

<?php$name = &#39;test&#39;;$str = "{{ $name }}";?>

要解决这个问题,我们需要将 PHP 的代码去掉,只留下 html 代码再做替换的处理。幸好 PHP 有一个方法 token_get_all,会将提供的内容按 PHP 标记进行分割。使用此方法解析如下内容:

$content = <<<VIEW<?php\$name = &#39;test&#39;;\$str = "{{ \$name }}";?><html>  <body>{{ \$name }}</body><html>VIEW;print_r(token_get_all($content));

这里$符号前加\是为了转移,在真正是现实不需要。结果如下:

Array
(
    [0] => Array
        (
            [0] => 379
            [1] => 79df71a31af495e95922af77b7cd9eab 1
        )
    [1] => Array
        (
            [0] => 382
            [1] =>
            [2] => 2
        )
    [2] => =
    [3] => Array
        (
            [0] => 382
            [1] =>
            [2] => 2
        )
    [4] => Array
        (
            [0] => 323
            [1] => 'test'
            [2] => 2
        )
    [5] => ;
    [6] => Array
        (
            [0] => 382
            [1] =>
            [2] => 2
        )
    [7] => =
    [8] => Array
        (
            [0] => 382
            [1] =>
            [2] => 3
        )
    [9] => "
    [10] => Array
        (
            [0] => 322
            [1] => {{
            [2] => 3
        )
    [11] => Array
        (
            [0] => 320
            [1] => $name
            [2] => 3
        )

    [12] => Array
        (
            [0] => 322
            [1] =>  }}
            [2] => 3
        )
    [13] => "
    [14] => ;
    [15] => Array
        (
            [0] => 382
            [1] =>
            [2] => 3
        )
    [16] => Array
        (
            [0] => 381
            [1] => ?>
            [2] => 4
        )
    [17] => Array
        (
            [0] => 321
            [1] =>
100db36a723c770d327fc0aef2ce13b1
  6c04bd5ca3fcae76e30b72ad730ca86d{{ $name }}36cc49f0c466276486e50c850b7e4956
100db36a723c770d327fc0aef2ce13b1
            [2] => 5
        )

)

可以看到 PHP 相关的代码被解析了,我们只需要判断出是 html 代码,然后做替换就可以了。其中的321就是定义好的常量T_INLINE_HTML的值,标记解析出来的就是 html 代码。

我们定义view文件的后缀为sf,那我们就可以在controller/model/view目录下创建view.sf文件,内容如下

<?php$title = &#39;It is a title&#39;;$str = "{{ $title }}";?><html>
    <head>
        <title>{{ $title }}</title>
    <head>
    <body>
        <h2>{{ $str }}</h2>
        <p>{{ $body }}<p>
    </body>
</html>

然后我们来改造Controller中的render方法,代码如下

public function render($view, $params = [])
{
    $file = '../views/' . $view . '.sf';
    $fileContent = file_get_contents($file);
    $result = '';
    foreach (token_get_all($fileContent) as $token) {
        if (is_array($token)) {
            list($id, $content) = $token;
            if ($id == T_INLINE_HTML) {
                $content = preg_replace('/{{(.*)}}/', '585b18efd61842428ef71257a69a2525', $content);
            }
            $result .= $content;
        } else {
            $result .= $token;
        }
    }
    $generatedFile = '../runtime/cache/' . md5($file);
    file_put_contents($generatedFile, $result);
    extract($params);
    require_once $generatedFile;
}

修改actionView如下

public function actionView(){$this->render(&#39;site/view&#39;, [&#39;body&#39; => &#39;Test body information&#39;]);}

访问 http://localhost/simple-framework/public/index.php?r=site/view ,得到如下页面
建構PHP框架之建構模版引擎實例

今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:

blog project:

以上是建構PHP框架之建構模版引擎實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn