我正在将 Symfony 从 3.4 升级到 4.3,并且遇到一种情况,每个路由都与控制器和方法正确匹配,但随后请求到达
RedirectableCompiledUrlMatcher
并将正确的参数替换为
_controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction
这会触发各种其他事情,例如调用参数转换器、访问防火墙以及其他与路由相关的事情,这是不应该的,因为匹配的路由不正确。
继续调试 3.4 项目,无需替换正确的参数。
我的问题是,这现在是否是正确的请求流(即每个路由都必须通过 urlRedirectAction),我需要配置其他内容,或者有什么方法可以避免调用,我猜,
RedirectableCompiledUrlMatcher
?
是否有可能发生这种情况,因为
RedirectableUrlMatcher
是 \Symfony\Component\Routing\Router
的默认匹配器,为什么它是默认匹配器?有机会像 3.4 中那样用普通的 UrlMatcher
替换它吗?
正是这一行
vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherTrait.php:63
,我的$ret
与我的控制器正确匹配,并且正在调用$this->redirect()
,它将我的控制器替换为Symfony RedirectController。
特质是 RedirectableCompiledUrlMatcher
类 的一部分
Symfony 4 更改了路由,以便对于 GET 和 HEAD 请求,带有尾部斜杠的路由被认为等同于没有斜杠的路由(参见 https://symfony.com/doc/4.3/routing.html#redirecting-urls-with -尾部斜杠)。
如果您有两个版本的路由定义,则将匹配第一个版本。如果您以其他方式使用,RedirectableUrlMatcherInterface 将创建到此路由的重定向。
# routes.yaml
foo:
path: /foo
controller: App\Controller\FooController::fooAction
foo_trail:
path: /foo/
controller: App\Controller\FooController::fooAction
GET /foo/
将重定向到GET /foo
,GET /foo
将正常匹配。
# routes.yaml
foo_trail:
path: /foo/
controller: App\Controller\FooController::fooAction
foo:
path: /foo
controller: App\Controller\FooController::fooAction
GET /foo
将重定向到GET /foo/
,GET /foo/
将正常匹配。
针对缺失/附加尾部斜杠的重定向是 CompiledUrlMatcherTrait 中第 63 行所做的(即示例 1 中的 GET /foo/
)。如果路由可以精确匹配(即示例 1 中的
GET /foo
),则不应到达此重定向,并且匹配器应在第 39 行中返回。 因此,对于您的特定路由配置,问题是:
您是否相信
/foo
/foo/
有所不同?使用默认匹配器将不再可能(对于 GET 或 HEAD 请求)。您是用 /foo
/foo/
还是反之亦然?这应该不是问题,但会导致重定向,从而可能在其他地方引起问题。