方法redirectToRoute() 可以有render() 之类的参数吗?

Posted

技术标签:

【中文标题】方法redirectToRoute() 可以有render() 之类的参数吗?【英文标题】:Can the method redirectToRoute() have arguments like render()? 【发布时间】:2016-04-18 22:30:52 【问题描述】:

我需要从 symfony2 访问 twig 中的实体。 在控制器内部,我可以执行以下操作:

return $this->render('frontendBundle::carrodecompras.html.twig', array(
        'entity' => $entity
));

然后在 twig 中,我可以使用 entity.name 等访问实体属性。

我需要完成同样的事情,但使用函数redirectToRoute()

return $this->redirectToRoute('frontend_carrodecompras', array(
        'entity' => $entity,
));

但它似乎不起作用。

我收到以下错误:

第 32 行的 frontendBundle::carrodecompras.html.twig 中不存在变量“实体”

编辑:我正在使用 Symfony 2.7

变量 $entity 存在(在我使用 $entity 进行简化的应用程序中它实际上称为 $cortina),就在 redirectToRoute 函数之前我这样做是为了测试它

echo "<pre>";
var_dump($cortina);
echo "</pre>";

return $this->redirectToRoute('frontend_carrodecompras', array(
                'cortina' => $cortina,
                ));

结果是这样的:

object(dexter\backendBundle\Entity\cortina)#373 (16) 
  ["id":"dexter\backendBundle\Entity\cortina":private]=>
  int(3)
  ...

这是 Twig 代码:

<tr>
    % set imagentela = "img/telas/" ~ cortina.codInterno ~ ".jpg" %
    <td><img src=" asset(imagentela | lower ) "   >
    </td>
    <td> cortina.nombre </td>
    <td> "$" ~ cortina.precio|number_format('0',',','.') </td>
</tr>

【问题讨论】:

你应该确认$entity确实存在。 实体在redirectToRoute方法被调用之前被持久化到数据库中,所以$entity是存在的! 我怀疑$entity 是否真的存在于您调用redirectToRoute 的位置。你能提供额外的上下文吗?如果它不是太大,也许调用redirectToRoute的函数?或者至少显示从定义$entity 的位置到使用它的位置的代码路径? 我编辑了问题以显示变量存在。问题是函数 redirectToRoute 没有将变量传递给 twig。 你想如何通过 url 发送对象?先序列化它。为什么不将实体 ID 传递给路由并在另一个控制器中获取它? 【参考方案1】:

当您从控制器调用 redirectToRoute($route, array $parameters) 时,$parameters 用于生成 url 令牌,而不是在视图中呈现的变量,这是由分配给您要重定向到的路由的控制器完成的。

示例:

class FirstController extends Controller

    /**
     * @Route('/some_path')
     */
    public function someAction()
    
        // ... some logic
        $entity = 'some_value';

        return $this->redirectToRoute('some_other_route', array('entity' => $entity)); // cast $entity to string
    


class SecondController extends Controller

    /**
     * @Route('/some_other_path/entity', name="some_other_route")
     */
    public function otherAction($entity)
    
        // some other logic
        // in this case $entity equals 'some_value'

        $real_entity = $this->get('some_service')->get($entity);

        return $this->render('view', array('twig_entity' => $real_entity));
    

【讨论】:

这个解决方案解决了这个问题。我没有在 otherAction (我最初重定向到的那个)中传递 $entity 变量。【参考方案2】:

$this-&gt;redirectToRoute('something', array('id' =&gt; 1)$this-&gt;redirect($this-&gt;generateUrl('something', array('id' =&gt; 1))) 的便捷包装器。它使用您的参数构建一个 URL,并期望参数的值是字符串或数字。

http://symfony.com/blog/new-in-symfony-2-6-new-shortcut-methods-for-controllers

您需要传递实体的 id,然后在新操作中获取数据,或者在调用 redirectToRoute() 之前将其分解为单独的数据。

class MyController extends Controller 
    public function myAction()
        $cortina = new Cortina();
        $cortina->something = "Some text";

        $em = $this->getDoctrine()->getManager();
        $em->persist($cortina);
        $em->flush();

        return $this->redirectToRoute('frontend_carrodecompras', array(
            'id' => $cortina->getId()
        );
    

【讨论】:

以上是关于方法redirectToRoute() 可以有render() 之类的参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

应该如何使用 RedirectToRoute?

跨控制器跳转view——RedirectToRoute和RedirectToAction

RedirectToAction 和 RedirectToRoute

如何使用redirectToRoute正确传递对象?

『Re』正则表达式模块_常用方法记录

『Re』正则表达式模块_常用方法记录