Symfony CMF链路由器:尽管路由匹配,但仍然出现404错误

时间:2018-10-16 17:55:46

标签: php symfony routing symfony4 symfony-cmf

我正在用Symfony 4构建一个可以通过插件扩展的应用程序。插件本质上是捆绑软件,但它们只是放到了文件夹中,不必激活(例如,在config/bundles.phpconfig/routes/中)。

为了让插件自动注册路由,我让CMF链路由器覆盖了默认的symfony @router服务。然后,每个插件可以具有标记为router的服务,链路由器将其添加到链中。这部分有效。

为了使插件更容易注册路由,核心应用提供了一个AnnotationRouter类,该类采用了在其中查找带注释的控制器的路径。然后,插件将注册如下服务:

sample_plugin.router:
    class: MyApp\Routing\AnnotationRouter
    arguments: ['@service_container', '@@SamplePlugin/Controller']
    tags:
      - { name: router, priority: 20 }

但是,这些路线的行为非常奇怪。实际上,它们仅在清除缓存后才对第一个请求起作用!所有后续请求均返回404错误。这就是symfony探查器中“路由”标签的样子。

Screenshot of the symfony profiler on subsequent requests

在顶部说不匹配路线,但是在底部说匹配!我不知道该怎么做。

此外,bin/console router:match /test2与路线匹配,并且bin/console debug:router列出路线。默认symfony路由器(除插件路由器之外,它是链中唯一的其他路由器)的所有路由都可以正常工作。

有趣的是,所有这些在以前仍在使用symfony 3时就已经起作用了。

1 个答案:

答案 0 :(得分:0)

好吧,事实证明,这毕竟不是CMF路由链路由器的问题,而是实际路由器的实现。

我的路由器实现如this question中所述。该问题与Doctrine的注释阅读器和注释自动加载有关。我最终安装了indigophp/doctrine-annotation-autoload,但这显然只是一种解决方法。

另请参见GitHub上的Autoloading annotation classes