根据路由注释切换模板

时间:2014-05-22 13:00:25

标签: symfony routing

我在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

2 个答案:

答案 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 ... ));
}