如何在symfony2服务中执行$ this-> render()?

时间:2014-05-28 10:37:47

标签: php symfony

我在普通的symfony2控制器中有这个代码:

            $temp = $this->render('BizTVArchiveBundle:ContentTemplate:'.$content[$i]['template'].'/view.html.twig', array(
                'c'=> $content[$i],
                'ordernumber' => 1,
            ));

它运作正常。

现在我正在尝试将其移至服务中,但我不知道如何访问普通控制器的$ this等价物。

我尝试像这样注射容器:

    $systemContainer = $this->container;

    $temp = $systemContainer->render('BizTVArchiveBundle:ContentTemplate:'.$content[$i]['template'].'/view.html.twig', array(
                'c'=> $content[$i],
                'ordernumber' => 1,
            ));

但是这不起作用,我猜这是因为渲染器并没有真正使用普通控制器的$ this->容器,而只使用$ this部分。

任何人都知道如何从服务中使用$ this-> render()?

2 个答案:

答案 0 :(得分:19)

检查render课程中的方法Symfony\Bundle\FrameworkBundle\Controller。它说:

return $this->container->get('templating')->render($view, $parameters);

因为您的服务中已经有容器,您可以像上面的示例一样使用它。

注意:将整个容器注入服务被认为是不好的做法,在这种情况下你应该只注入模板引擎并在模板对象上调用render方法。

如此完整的图片:

services.yml

services:
    your_service_name:
        class: Acme\YourSeviceClass
        arguments: [@templating]

你的班级:

public function __construct($templating)
{ 
    $this->templating = $templating
}

和你的渲染电话:

$this->templating->render($view, $parameters)

答案 1 :(得分:4)

使用构造函数依赖注入(使用Symfony 3.4测试):

class MyService
{
    private $templating;

    public function __construct(\Twig_Environment $templating)
    {
        $this->templating = $templating;
    }

    public function foo()
    {
        return $this->templating->render('bar/foo.html.twig');
    }
}