如何在symfony 2中将对象作为renderView()参数传递

时间:2014-10-21 05:02:35

标签: php symfony

我有一个symfony 2的问题(我对这个框架很新,我想学习如何正确使用,所以我希望你可以帮助我。)

我的问题如下:

我想在模板中展示产品,我需要传递一些参数,如姓名,描述和价格:

public function showAction($id)
{
    $product = $this->getDoctrine()->getRepository('AcmeReadBundle:Product')->find($id);
    if(!$product)
    {
        throw $this->createNotFoundException('error: not found');
    }
    $content = $this->renderView('AcmeReadBundle:Show:index.html.twig',$product);
    return new Response($content);
}

如果我这样做,我有这个错误:

Catchable Fatal Error: Argument 2 passed to Symfony\Bundle\FrameworkBundle\Controller\Controller::renderView() must be of the type array, object given

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

你做得很好,除了你应该将参数传递给数组中的模板,最好直接返回渲染模板!

public function showAction($id)
{
    $product = $this->getDoctrine()->getRepository('AcmeReadBundle:Product')->find($id);
    if(!$product)
    {
        throw $this->createNotFoundException('error: not found');
    }
    return $this->render('AcmeReadBundle:Show:index.html.twig', array('product'=> $product));
}

答案 1 :(得分:0)

你需要把:

$return $this->renderView('AcmeReadBundle:Show:index.html.twig',array('product' => $product));

你应该传递像array

这样的参数

答案 2 :(得分:0)

如果为产品制作模板 AcmeReadBundle:Show:index.html.twig ,则放置另一个"产品"表达式前面的前缀,如下:

{{ product.title }}
{{ product.price }}

这样看是正确的

{{ title }}
{{ price }}

在模板中。所以包装是一个糟糕的选择。 最佳选择是使用get_object_vars() ,它会自动将对象转换为数组:

return $this->render('AcmeReadBundle:Show:index.html.twig', get_object_vars($product));        

这样你可以使用这个模板从另一个模板中调用它(因为它在每个表达式之前都不包含" product" -prefix),例如在通过Products集合进行迭代时,因为您的Products集合将包含Products的集合,而不是Arrays of 1 object which is Product的集合。