superruzafa/template

递归模板引擎

1.0.0 2014-11-12 21:11 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:00:33 UTC


README

这是一个递归模板引擎。

StringTemplate

最基本的模板是字符串模板。它将包含 {{ 变量 }} 的字符串替换为传递的替换值。

$replacements = array(
    'variable' => 'replacement'
);
$string = 'this string contains a {{ variable }}';
$template = new StringTemplate($string);
echo $template->render($replacements);
// 'this string contains a replacement'

ArrayTemplate

数组模板以与 StringTemplate 相同的方式渲染其值。

$replacements = array(
    'vehicle' => 'car',
    'color'   => 'dark gray'
);
$array = array(
    'My {{ vehicle }} color is {{ color }}',
    'Because {{ color }} is my favourite color',
    'I also likes the {{ alternative-color }} color'
);
$template = new ArrayTemplate($array);
var_dump($template->render($replacements));
// array(
//    'My car color is dark gray',
//    'Because dark gray is my favourite color',
//    'I also likes the  color'
// );

数组自渲染

非常简单,对吧?数组模板可以通过将其自身用作替换提供者来自渲染!

$array = array(
    'vehicle' => 'bicycle',
    'color'   => 'blue',
    'phrase'  => 'My {{ vehicle }} color is {{ color }}',
);
$template = new ArrayTemplate($array);
var_dump($template->render());
// array(
//    'vehicle' => 'bicycle',
//    'color'   => 'blue',
//    'phrase'  => 'My bicycle color is blue',
// )

替换可以包括其他子替换

$array = array(
    'title'      => '{{ name }} {{ job }}',
    'name'       => '{{ firstName }} {{ surName }}',
    'firstName'  => 'Philip {{ middleName }}',
    'middleName' => 'J.',
    'surName'    => 'Fry',
    'job'        => 'Slacker delivery boy'
);
$template = new ArrayTemplate($array);
var_dump($template->render());
// array(
//     'title'      => 'Philip J. Fry, Slacker delivery boy',
//     'name'       => 'Philip J. Fry',
//     'firstName'  => 'Philip J.',
//     'middleName' => 'J.',
//     'surName'    => 'Fry'
// );

循环引用

循环引用将被检测,替换为空字符串,并通过警告通知。

$love_triangle = array(
    'me'  => 'I like {{ you }}',
    'you' => 'You like {{ she }}',
    'she' => 'She likes {{ me }}'
);
$template = new ArrayTemplate($love_triangle);
var_dump($template->render());

// Warning: Cyclic recursion: you -> she -> me -> you in ...
// Warning: Cyclic recursion: she -> me -> you -> she in ...
// Warning: Cyclic recursion: me -> you -> she -> me in ...

// array(
//  'me'  => 'I like You like She likes I like ',
//  'you' => 'You like She likes I like You like ',
//  'she' => 'She likes I like You like She likes '
// )

奇怪吧?该引擎在栈中存储正在被替换的变量。当找到这些变量的值正在被渲染时,就会检测到循环递归。例如,为了解决 "me" 条目,该引擎遵循以下步骤:

1) me = 'I like {{ you }}'                   <- Replace {{ you }} by 'You like {{ she }}'
2) me = 'I like You like {{ she }}'          <- Replace {{ she }} by 'She likes {{ me }}'
3) me = 'I like You like She likes {{ me }}' <- Cyclic recursion detected, *me* is already being resolved