【问题标题】:Symfony2 Multiple Routes for Single ControllerSymfony2 单个控制器的多个路由
【发布时间】:2013-07-24 01:33:50
【问题描述】:

是否可以在一个定义中定义同一个控制器的多个路由?

例如:

我想要一个单一的定义

/, /about, /privacy-policy

使用类似的东西

_home:    
    pattern:   {/ , /about, /privacy-policy}  
    defaults:  { _controller: AcmeDemoBundle:Home:index, about, privacy_policy }

我不想按照here 的建议在单独的定义中定义多个路由。

编辑:这是我的源代码:

<?php

namespace Acme\DemoBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HomeController extends Controller
{
    /**
     * @Route("/")
     */
    public function indexAction()
    {
        /*
         * The action's view can be rendered using render() method
         * or @Template annotation as demonstrated in DemoController.
         *
         */
        return $this->render('AcmeDemoBundle:Home:home.html.tpl');
    }
    /**
     * @Route("/about")
     */
    public function aboutAction()
    {
        return $this->render('AcmeDemoBundle:Home:about.html.tpl');
    }    
}

这是routing.yml的源码

_home:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Home:index }
_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }
_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo

【问题讨论】:

  • 如何按照您发布的链接中的建议使用注释?这是 AFAIK 的唯一方法......
  • 我尝试使用它,但出现错误“找不到“GET /about”的路线”,你能告诉我我错过了什么吗?即使对于我的另一个方法“索引”,我也收到错误“[语义错误] Acme\DemoBundle\Controller\HomeController::indexAction() 方法中的注释“@Route”从未导入。你可能忘记添加“使用"这个注释的声明?"
  • 它是名为SensioFrameworkExtraBundle 的可选捆绑包的一部分,此特定功能的配置可在此处找到:symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/…(不要忘记控制器开头的use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 语句)
  • 我已经添加了我的代码,在使用额外的路由控制器后 /about 页面仍然无法正常工作并出现相同的错误“找不到 "GET /about" 的路由”
  • 你可以有多个路径指向同一个 Controller:Action。但是,不能有相同的路径指向不同的 Controllers:Actions。所以你应该删除indexAction()aboutAction() 上的@Route("/")。你有activated the annotations in your routing.yml吗?

标签: symfony routing definition


【解决方案1】:

如果你没有为你的路由注释声明名字,symfony 生成一个。 (“使用@Route 注解定义的路由会被赋予一个由包名、控制器名和动作名组成的默认名称。”来自http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/routing.html

通过声明多个路由 symfony 生成一个名字(如果你不精确你的名字),女巫可能会通过保留第一个来覆盖你的其他路由。

您可以尝试通过为注释中的每条路线随机命名来进行测试。

最后一件事是不要忘记你的根路由文件,方法是添加一个链接到你的包,就像文档中的这个例子一样。

blog:
    resource: "@SensioBlogBundle/Controller"
    type:     annotation 

【讨论】:

  • 我只是想在单个定义中定义多个路由,用逗号分隔或任何其他方式(如@cheesemacfly 建议的注释)但是我仍然面临使用注释的问题。你能建议一下吗
  • 如果你没有为你的路由注释声明名字,symfony 生成一个。 (“使用@Route 注解定义的路由被赋予了一个由包名、控制器名和动作名组成的默认名称。”来自symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/…)通过声明多个路由 symfony 生成一个名称(如果你不精确的话你的名字)女巫可能会通过保留第一个来覆盖你的其他路线。您可以尝试通过为注释中的每条路线随机命名来进行测试。
  • 它现在工作了!!!非常感谢您的回复。您可能想更新您的答案,说在 /app/config/routing.yml 中激活路由并使用注释,所以我会赞成并接受它作为正确答案。
  • 谢谢。我不确定它会帮助你。但很高兴你找到了你的解决方案:)。
【解决方案2】:

[语义错误] Debril\RssAtomBundle\Controller\YOURController::indexAction() 方法中的注释“@Template”从未导入。您是否可能忘记为此注释添加“使用”语句?

必须在 YOURController 中添加两个使用:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多