如何在symfony中从服务类渲染视图?

时间:2017-06-03 13:49:31

标签: symfony view render

我试图在我的服务类中创建一个函数来渲染一个twig页面。我试过这样做: 的 service.yml:

********
parameters:
    error.class: AppBundle\Utils\Error
services:
    app.error:
        class: '%error.class%'
        arguments: [@templating]

Error.php(服务类):

****
class Error
{
    public function __construct($templating)
    {
        $this->templating = $templating;
    }

    public function redirectToError($condition,$message)
    {
        if($condition){
            return $this->templating->render('default/error.html.twig',array(
                'error_message' => $message,
            ));
        }
    }

}

error.html.twig 有一些随机文字,看它是否到达那里。

之后我从浏览器得到了这个答案:

enter image description here

有人可以告诉我这是什么问题吗?

2 个答案:

答案 0 :(得分:4)

在语法方面,YAML可能有点不确定,请确保使用所有空格(无标签字符)。并确保每个缩进都是相同数量的空格字符。如果您喜欢4宽,请像每个级别的2/4/6/8或4/8/12等。

您发布的代码应该没问题,但它可能是如上所述的愚蠢行为。如果它实际上是文件中的错误部分/参数,symfony应该告诉你什么是意外的,因为它实际上验证了其内容上的YAML文件。

Allright所以['@templating']处理YAML解析错误,下一部分是如何使用服务。这是使用service container完成的。

在控制器中有一个别名,您可以执行以下操作:

// required at the top to use the response class we use to return
use Symfony\Component\HttpFoundation\Response;

// in the action we use the service container alias
// short for $this->container->get('app.error');
$content = $this->get('app.error')->redirectToError(true, 'Hello world');
// as your redirectToError function returns a templating->render, which only returns a
// string containing the the rendered template, however symfony
// requires a Response class as its return argument.
// so we create a response object and add the content to it using its constructor
return new Response($content);

一些小事:

$condition,可能会改变,如果不是它似乎不应该在函数中而是在函数调用周围,因为调用redirectToError似乎很奇怪但是没有错误,而是我们只是调用它当我们确实有错误时。

如果你要设置一个类变量来定义它(details on visibility):

,建议使用它
class Error {
    // visibility public, private, protected 
    protected $templating;

答案 1 :(得分:0)

您应该将'放在@templating

附近
services:
    app.error:
        class: AppBundle\Utils\Error
        arguments: ['@templating']