【问题标题】:Switch template depending on the routing annotation根据路由注解切换模板
【发布时间】:2014-07-11 12:49:44
【问题描述】:

我在Controller中有以下方法:

/**
 * @Route("/add", name="item_add")
 * @Route("/edit/{id}", name="item_edit")
 * @Template
 */
public function editAction(Request $request, Item $item = null)

此方法加载 edit.html.twig 模板,因为操作名称。

如果item_add路由匹配,是否可以强制使用add.html.twig模板,如果item_edit匹配,是否可以强制使用edit.html.twig

【问题讨论】:

  • 为什么要在一条路线中结合("GET", "PUT") 两种不同的行为?如果你想重用你的模板,extending你的视图有什么问题?
  • @Touki 因为get和put动作的逻辑是一样的。
  • 如果它们相同,那么您可以创建第二条路线public function editAction(Request $request) { return $this->addAction($request); } 并保留您的注释
  • @Touki 你是对的,但是我认为控制器的最大简单性。

标签: symfony routing


【解决方案1】:

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

【讨论】:

  • 是的,你的例子很有意义...... :)
【解决方案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 ... ));
}

【讨论】:

  • 是否可以在不手动渲染模板的情况下做到这一点 - 仍然使用@Template 注释?
  • 不,我认为这不可能。我有一个关于如何克服这个问题的想法......现在更新答案......
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2020-05-04
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多