2015-08-09 59 views
1

任何人都可以请解释如何创建对象并从胡须模板调用它的方法吗?从胡子访问回调的方法


我想添加一些回调胡子的帮手:

$options['helpers'] = array(
    'Post' => array('\Classes\Post', 'getObject') 
); 

下面是一个简单类:

namespace Classes; 

class Post 
{ 
    public static function getObject() 
    { 
     return new Post(\Request::postId()); 
    } 

    public function post() 
    { 
     $post = new \stdClass; 
     $post->title = 'Title'; 
     $post->content = 'Content'; 

     return $post; 
    } 

    public function comments() 
    { 
     $comment = new \ArrayObject(); 

     $comment[0] = new stdClass; 
     $comment[0]->name = 'David'; 
     $comment[0]->content = 'I\'m David'; 

     $comment[1] = new stdClass; 
     $comment[1]->name = 'Mary'; 
     $comment[1]->content = 'I\'m Mary'; 

     $comment[2] = new stdClass; 
     $comment[2]->name = 'Sana'; 
     $comment[2]->content = 'I\'m Sana'; 

     return $post; 
    } 
} 

而且在post.Mustache文件中使用它:

<h1>{{Post.title}}</h1> 
<p>{{Post.content}}</p> 
<hr> 
{{#Post.comments}} 
    <b>{{name}}</b> Said: {{content}}<br><br> 
{{/Post.comments}} 

但是,看起来这不是以正确的方式访问链式方法和属性?!

回答

0

简短的回答是,胡子工程好了很多,如果你在传递值而不是模板调用出来,让他们:)

$m->render($tpl, ['Post' => Post::getObject()]); 

如果你有兴趣在较长的答案:

助手只是在渲染上下文中的奖励值。因此,添加Post助手相当于使用['Post' => ['Post', 'getObject']]调用render()。

在小胡子中,如果标签的是一个函数,则会以特殊方式处理它们(它们称为lambdas)。您可以看到示例on the Mustache.php wiki

所以在你的情况下,你会遇到奇怪的区别。基本上,您的渲染调用中的{{Post}}的值不是新帖,它是可调用的['Post', 'getObject']。所以这个值触发lambda逻辑而不是普通的字符串插值。

+0

谢谢贾斯汀以上的答案,以及你的大胡子实施。由于我们特殊的体系结构,原则和限制,我们不能将对象或lambda添加到Mustache中,数组回调是我们唯一的选择。因此,我们将做出决定,要么胡须叉或实施我们自己的模板引擎,以满足我们的需求。再次感谢您的大胡子实施; { – David