【问题标题】:Routing order symfony 4路由顺序 symfony 4
【发布时间】:2018-01-29 04:14:48
【问题描述】:

在尝试匹配像 site.com/photossite.com/blog 这样的 url 之后,我想在末尾有一个带有通配符的 url site.com/{username}。我正在使用注释并有两个控制器。

我在这里找到了答案Ordering of routes using annotations

但文件夹结构在版本 4 中有所不同,并且在我使用注释时他们使用 YAML 的答案,所以我不完全理解在哪里放置什么。

视频控制器

    /**
     * @Route("/videos", name="videos")
     */
    public function index()
    {
      // Show video homepage
    }

用户控制器

    /**
     * @Route("/{username}", name="profile")
     */
    public function index()
    {
        // Hello {username} !
    }

按此顺序,site.com/videos 到达用户控制器而不是视频。我是否必须切换到手动将 all URL 结构放入 yaml 格式,或者有没有办法在注释中设置优先级?

到目前为止,我发现的唯一方法是创建一个以字母“Z”开头的控制器,并将动作/路线放在那里,这似乎是最后运行路线。

【问题讨论】:

  • 幕后没有什么神奇的,路由catch第一个找到的路径。这个行为是众所周知的github.com/symfony/symfony/issues/18415正如你所说,你必须得到一个线索并重命名你的控制器。这是“肮脏的”和奇怪的,但它就像一个魅力

标签: php symfony


【解决方案1】:

您链接到的问题实际上非常相关。你问的和其他人一样:

但是,如果您将路由定义为控制器中的注释,您将如何做到这一点?在这种情况下,有什么方法可以指定这条路线的顺序吗?

在 Symfony 4 中,你的 config/routes.yaml 可能是空的,config/routes/annotations.yaml 可能是这样的:

controllers:
    resource: ../../src/Controller/
    type: annotation

你可以用这个替换上面的 YAML——注意顺序很重要:

Video:
    resource: App\Controller\VideoController
    type: annotation

User:
    resource: App\Controller\UserController
    type: annotation

那么site.com/videos首先到达视频控制器。

【讨论】:

  • 这意味着现在每个控制器都需要在config/routes.yaml 中声明,对吧?
  • @Link14,我已经有一段时间没有使用 Symfony 了,但我会这么认为。通过省略config/routes.yaml 中的控制器并测试控制器的路由是否有效,应该很容易测试。
【解决方案2】:

您必须使用yml/xml 定义您的路线才能完全配置它们的顺序。
如果你真的想使用注释,你可以添加一个前缀,比如user-:

/**
 * @Route("/user-{username}", name="profile")
 */
public function index()
{
    // Hello {username} !
}

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2018-06-15
    • 2021-02-20
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多