【问题标题】:Ordering of routes using annotations使用注释对路线进行排序
【发布时间】:2012-08-01 12:18:51
【问题描述】:

当你在 symfony 中创建路由并且你想要一个类似的路由时通常的解决方案

/{username}

为了不与 /login 或 /info 等其他路由发生冲突,只需将该路由作为您的最后一个路由放在您的 routing.yml 文件中。由于所有其他路由优先,因此避免了这种冲突。但是,如果您将路由定义为控制器中的注释,您怎么能做到这一点呢?在这种情况下,有什么方法可以指定这条路线的顺序吗?

【问题讨论】:

  • 嗨 Carlos,但是如果一个用户使用登录用户名注册会发生什么?然后有两条路线相等。你能解决吗?

标签: symfony


【解决方案1】:

在控制器的上下文中,动作方法的顺序定义了路由的顺序。在整个应用的上下文中,你可以显式地导入每个控制器来控制顺序,例如:

Home:
    resource: "\Vendor\Controller\HomeController"
    type: annotation

Security:
    resource: "\Vendor\Controller\SecurityController"
    type: annotation

security.log_out:
    pattern: "/logout"

User:
    resource: "\Vendor\Controller\UserController"
    type: annotation

【讨论】:

  • 我发现这目前(Symfony 2.4)仅适用于完整的控制器文件名。所以,HomeController.php 而不仅仅是HomeController
  • @MassimilianoArione,这些是命名空间——不是文件路径。如果命名空间对您不起作用,那么您做错了什么。它在 2.4 和 2.5 中都非常适合我。
  • 在 symfony 4 中,不需要指定所有的控制器。首先,指定 symfony.com/doc/current/routing.html 中记录的控制器。后面必须添加的控制器,把它添加到'routes/annotations.yaml'中。此答案中给出的符号。
【解决方案2】:

我无法对答案发表评论,所以我将留下我在 Symfony 2.3 中编写它以使其工作的方式:

Home:
    resource: "@AcmeBundle/Controller/HomeController.php"
    prefix: /home #optional
    type: annotation

注意“\”更改为“/”并在控制器名称末尾使用.php。

【讨论】:

    【解决方案3】:

    您需要在 routing.yml 末尾覆盖该路由的规则。您可以通过使用与注释自动创建的路径相同的名称来执行此操作。您可以使用控制台命令找到名称:

    php app/console debug:router
    

    所以在你的 routing.yml 作为最后一行你将添加:

    the_name_of_the_route_as_found_with_appconsole_debug_router:
        path:/{username}
        defaults:  { _controller: YourBundle:YourController:the_action_to_use } 
    

    默认情况下,通过使用相同的名称,您将覆盖原来的名称。不要忘记其他可能很重要的选项。例如 {username} 或方法的默认值或 null。

    您还可以从控制器的注释中完全删除路由。它不再需要,因为它无论如何都会被覆盖:)

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多