我在Controller中有以下方法:
/**
* @Route("/add", name="item_add")
* @Route("/edit/{id}", name="item_edit")
* @Template
*/
public function editAction(Request $request, Item $item = null)
由于操作名称,此方法会加载edit.html.twig
模板。
如果add.html.twig
路线匹配,是否可以强制使用item_add
模板;如果匹配edit.html.twig
,是否可以item_edit
答案 0 :(得分:3)
jperovic提供的答案似乎是正确的,但恕我直言,使用路线名称感觉不对。
可以轻松地避免依赖路线名称。
这是一个例子
/**
* @Route("/add", name="item_add")
* @Method({"GET"})
* @Template
*/
public function addAction(Request $request, Item $item = null)
{
if (null === $item) {
$item = new Item;
}
$form = $this->createForm(new ItemType, $item, [
'action' => $this->generateUrl('item_update'), // In your view?
'method' => 'POST'
]);
return [
'form' => $form->createView()
];
}
/**
* @Route("/edit/{id}", name="item_edit")
* @Method({"GET"})
* @Template
*/
public function editAction(Request $request, Item $item)
{
return $this->addAction($request, $item);
}
有了这个,你将有两条路线做同样的事情,并发送相同的参数
/edit/{id} => edit.html.twig
/add => add.html.twig
答案 1 :(得分:2)
当然是。 tuxedo25
在此解释了这一点:How to get current route in Symfony 2?
基本上:
$routeName = $request->get('_route');
if ( $routeName == "item_add"){
// render template "add.html.twig"
}else{
// render template "edit.html.twig"
}
希望这会有所帮助......
想法#1:
如果您想使用@Template
,您仍然可以像往常一样保留注释,但您会:
return array(
'route_name' => $routeName,
// some other data
);
然后:
item.html.twig
{% include routeName == 'item_add' ? 'item_add.html.twig' : 'item_edit.html.twig' %}
尽管如此,虽然这解决了这个问题,但我觉得它非常麻烦。我个人不会这样做。
想法#2:
这个想法完全不同。虽然它不使用@Template
,但它最大限度地减少了出错的可能性:
/**
* @Route("/add", name="item_add")
* @Route("/edit/{id}", name="item_edit")
*/
public function editAction(Request $request, Item $item = null){
$routeName = $request->get('_route');
# Your controller's logic here
return $this->renderView(sprintf('VendorNamespaceBundle:ControllerClass:%s.html.twig', $routeName), aray(... your data here ... ));
}