方法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->redirectToRoute('something', array('id' => 1)
是$this->redirect($this->generateUrl('something', array('id' => 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() 之类的参数吗?的主要内容,如果未能解决你的问题,请参考以下文章
跨控制器跳转view——RedirectToRoute和RedirectToAction