Symfony:如何在继承控制器动作中将数据分配给模板?

时间:2015-07-02 15:29:31

标签: php symfony twig

我有TheParentController和继承TheChildController,它应该将$moreData分配给模板,但render()方法应该在TheParentController中调用。< / p>

这种情况有什么功能/服务吗?我期待像

这样的东西

$this->get('templating')->assignDataForTemplate('moreData', $moreData);

class TheParentController 
{
    public function myAction($param1) {
        return $this->render('template.html.twig', array(
            'someData' => $someData
        ));
    }

}

-

class TheChildController 
{
    public function myAction($param1) {
        // !
        // Is there any function like "assignDataForTemplate"?
        $this->get('templating')->assignDataForTemplate('moreData', $moreData);
        // /!
        return parent::myAction($param1);
    }
}

我想避免像

这样的事情
// ...
public function myAction($param1, $moreData = null) {
    return $this->render('template.html.twig', array(
            'someData' => $someData,
            'moreData' => $moreData
        ));
    }
}

2 个答案:

答案 0 :(得分:2)

据我所知,目前没有办法做到这一点。如果您查看来源,则会看到调用$templating->render()实际上正在调用TwigEngine->render()。这会调用Twig_Template->render()将模板输出到客户端。

我完全理解为什么你可能会使用HMVC,但我相信这种方法可能会让你感到过度复杂。如果控制器之间有公共代码 - 只需创建一个可以直接调用的静态类。然后将您的常用逻辑/代码移到那里,并在需要时随时调用它。

否则,您可能需要坚持使用您现在试图避免的代码(或类似的解决方法)。

答案 1 :(得分:1)

您可以尝试这样的事情,以便父母不知道孩子。

<?php    
class TheParentController {

    public function myAction () {
        $data = $this->getMyActionData();
        return $this->render('template', $data);
    }

    protected function getMyActionData () {
        return [
             'someDefault' => 5
        ];
    }
}

class TheChildController extends TheParentController {

    // If using annotation based routing override myAction
    // with call to parent function and new @Route tag in doc block

    protected function getMyActionData () {
        $parentData = parent::getMyActionData();
        return array_merge($parentData, [
            'childData' => 11  
        ]); 
    }
}