Symfony 为什么调用父控制器操作而不是子控制器操作

Symfony 为什么调用父控制器操作而不是子控制器操作,symfony,inheritance,controller,routing,Symfony,Inheritance,Controller,Routing,我刚刚偶然发现: 给定特定的路由,symfony调用父控制器类操作方法,而不是子类 routing.yml非常简单: new_message_favorites: #there are no routes defined like this with optional parameters pattern: /messages/new/fans defaults: { _controller: BigBundle:VisitorMessages:sendToFavorites

我刚刚偶然发现: 给定特定的路由,symfony调用父控制器类操作方法,而不是子类

routing.yml
非常简单:

new_message_favorites:
  #there are no routes defined like this with optional parameters
  pattern:   /messages/new/fans
  defaults:  { _controller: BigBundle:VisitorMessages:sendToFavorites }
应该处理请求的类被称为
VisitorMessageController
,操作方法被称为
sendToFavoritesAction
,正如您所期望的那样:

class MessagesController {
  //this one gets called
  public function sendToFavoritesAction(Request $request) { [...] }
}

class VisitorMessagesController extends MessagesController {
  //instead of this
  public function sendToFavoritesAction(Request $request) { [...] }
}
它们都不被定义为服务,都位于正确的命名空间和文件夹中,但在打开url时会调用父操作,而不是
VisitorMessageController
s版本

注意:MessagesControlled没有action方法的基本版本,但是我得到了“Controller方法不可调用”错误,这就是我发现symfony试图调用父方法的原因

为什么会这样

更新:

在symfony日志中,如果我在父方法中出错,它将显示正确的路径
INFO-匹配的路由“新建邮件收藏夹”(参数:“\u控制器”:“BigBundle\controller\VisitorMessageController::sendToFavoritesAction”、“\u区域设置”:“en”、“\u路由”:“新建邮件收藏夹”)

但是如果我从父类中删除该方法,那么它会给出一个
ReflectionException
方法不存在

Method BigBundle\Controller\messages控制器::sendToFavoritesAction()不存在

更新2: 有4种不同的方法映射到
VisitorMessageController
中的路由,它们都以某种方式映射到父类

更新3: 我已重新创建了引发异常的条件
Symfony\Component\HttpKernel\Controller\ControllerResolver

$callable = [new VisitorMessagesController(), 'sendToFavoritesAction'];
if (!is_callable($callable)) { throw Ex }

奇怪的是,在
ControllerResolver
中,这会解析为false,从而导致异常,但在另一个控制器中,同样的事情会解析为true

如果不将方法
sendToFavorites
声明为public,则会发生此错误。因此内核不能调用它。请检查这一点。

如果未将方法
sendToFavorites
声明为公共,则会发生此错误。因此内核不能调用它。请检查这一点

  • 删除symfony cache/dev目录以确保这不是缓存问题
  • 如果此路线没有额外声明,请在整个项目中搜索
    sendToFavorites
  • 我也会说这是一个打字错误,但如果你说你检查了这么多次
  • 删除symfony cache/dev目录以确保这不是缓存问题
  • 如果此路线没有额外声明,请在整个项目中搜索
    sendToFavorites
  • 我也会说这是一个打字错误,但如果你说你检查了这么多次

  • jms/di额外捆绑包中有一个已知问题导致了此错误:请参见

    jms/di额外捆绑包中有一个已知问题导致了此错误:请参见

    是否可能有一个类似的路由匹配,可能与某种占位符匹配?这非常奇怪。您是否已尝试清除缓存?检查您的
    sendToFavorites
    是否声明为
    public
    。检查VisitorMessageController::sendToFavorites的拼写是否使用JMSDiextrable?可能是这个错误:有没有可能你有一个类似的路线可能匹配,可能有某种占位符?这很奇怪。您是否已尝试清除缓存?检查您的
    sendToFavorites
    是否声明为
    public
    。检查VisitorMessageController::sendToFavorites的拼写是否使用JMSDiextrable?可能是这个bug:它肯定是公共的;我会更新描述使它更清楚。它肯定是公开的;我会更新描述使它更清楚。