Symfony3 - 正常路由被解释为具有 parameters/slugs 的路由

Symfony3 - normal route is interpreted as a route with parameters/slugs

我在我的应用程序中定义了以下路由:

-------------------------- ---------- -------- ------ -----------------------------------
 Name                       Method     Scheme   Host   Path
-------------------------- ---------- -------- ------ -----------------------------------
 _wdt                       ANY        ANY      ANY    /_wdt/{token}
 _profiler_home             ANY        ANY      ANY    /_profiler/
 _profiler_search           ANY        ANY      ANY    /_profiler/search
 _profiler_search_bar       ANY        ANY      ANY    /_profiler/search_bar
 _profiler_info             ANY        ANY      ANY    /_profiler/info/{about}
 _profiler_phpinfo          ANY        ANY      ANY    /_profiler/phpinfo
 _profiler_search_results   ANY        ANY      ANY    /_profiler/{token}/search/results
 _profiler                  ANY        ANY      ANY    /_profiler/{token}
 _profiler_router           ANY        ANY      ANY    /_profiler/{token}/router
 _profiler_exception        ANY        ANY      ANY    /_profiler/{token}/exception
 _profiler_exception_css    ANY        ANY      ANY    /_profiler/{token}/exception.css
 _twig_error_test           ANY        ANY      ANY    /_error/{code}.{_format}
 api_route                  ANY        ANY      ANY    /api
 sec_events_index           GET        ANY      ANY    /sec/events/
 sec_events_new             GET|POST   ANY      ANY    /sec/events/new
 sec_events_show            GET        ANY      ANY    /sec/events/{id}
 sec_events_edit            GET|POST   ANY      ANY    /sec/events/{id}/edit
 sec_guest_delete           ANY        ANY      ANY    /sec/guest/{id}
 sec_events_delete          DELETE     ANY      ANY    /sec/events/{id}
 pub_event                  ANY        ANY      ANY    /{id}/{guestid}
 home_page                  ANY        ANY      ANY    /
 about_page                 ANY        ANY      ANY    /about
 products_route             ANY        ANY      ANY    /products
 sec_guests_new             GET|POST   ANY      ANY    /sec/guests/new
 sec_guests_edit            GET|POST   ANY      ANY    /sec/guests/{id}/edit
 send_invite                ANY        ANY      ANY    /sec/invites
 admin_index                GET        ANY      ANY    /admin/users
 profile_show               ANY        ANY      ANY    /sec/profile
 admin_edit                 GET|POST   ANY      ANY    /admin/{id}/edit
 sec_delete                 DELETE     ANY      ANY    /admin/{id}
 login_route                ANY        ANY      ANY    /login
 login_check                ANY        ANY      ANY    /login_check
 pass_reset                 ANY        ANY      ANY    /reset
 pass_reset_form            ANY        ANY      ANY    /{token}
 test                       ANY        ANY      ANY    /test
 homepage                   ANY        ANY      ANY    /
 logout                     ANY        ANY      ANY    /logout
-------------------------- ---------- -------- ------ -----------------------------------

每当我使用 /sec/profile 通过浏览器访问路由 profile_show 时,探查器会告诉我它会尝试访问路由 pub_event ,就好像我在浏览器中输入了 /{id}/{guestid} 一样。

是不是我做错了什么让它选择正确的路线和正确的控制器和方法?

您需要将您的路线 pub_event 移动到 routing.yml 中导入路线的末尾。

这是正常行为,因为 /sec/profile 匹配 /{id}/{guestid}。好的做法是在 routing.yml 文件末尾加载通用路由。

您可以做的另一件事是在 pub_event 路由中设置对 id 参数的要求。

有了注释,它应该是这样的:

/**
 * @Route("/{id}/{guestid}", requirements={"id" = "\d+"}, defaults={"id" = 1})
 */

记住"Earlier Routes always Win"。在 Symfony Routing 书中阅读更多关于要求的信息:http://symfony.com/doc/current/book/routing.html#adding-requirements