Mustache中的动态部分引用


Dynamic partial references in Mustache

想知道是否可以基于变量动态引用部分。

考虑下面这个过度简化的上下文、模板和示例渲染-

test.php

<?php
$context = [
    //...
    "partial" => "partial/to/include"
    //...
];
echo (new Mustache_Engine)->render(
    "<h1>Test template</h1> {{> {{ partial }} }}",
    $context
);

现在很明显,这是行不通的,但它说明了一点(我希望)。有没有干净利落的解决办法?

我只能看到三个解决自己的办法,没有一个是理想的-
1. 助手
2. 扩展Mustache_Engine类3.If/Not阻塞并将模板名设置为上下文中带有布尔值的键(有很多可能被引用的部分,这是不可维护的)

这有点做作,但似乎可以通过定义一个呈现包含的函数来实现:

$context = [
    'partial' => function () { return '{{> partial/to/include }}'; },
];
echo (new Mustache_Engine)->render(
    '<h1>Test template</h1> {{{ partial }}}',
    $context
);

如果你要使用它两次以上,你可以把它清理干净,变成这样:

function dynamic_partial($partial) {
    return function () use ($partial) {
        return "{{> $partial }}";
    };
}
$context = [
    'partial' => dynamic_partial('partial/to/include'),
];
echo (new Mustache_Engine)->render(
    '<h1>Test template</h1> {{{ partial }}}',
    $context
);

可能有更干净的方法,但这是我找到的。