Symfony 为什么调用父控制器操作而不是子控制器操作
我刚刚偶然发现: 给定特定的路由,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
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
声明为公共,则会发生此错误。因此内核不能调用它。请检查这一点
sendToFavorites
sendToFavorites
jms/di额外捆绑包中有一个已知问题导致了此错误:请参见jms/di额外捆绑包中有一个已知问题导致了此错误:请参见是否可能有一个类似的路由匹配,可能与某种占位符匹配?这非常奇怪。您是否已尝试清除缓存?检查您的
sendToFavorites
是否声明为public
。检查VisitorMessageController::sendToFavorites的拼写是否使用JMSDiextrable?可能是这个错误:有没有可能你有一个类似的路线可能匹配,可能有某种占位符?这很奇怪。您是否已尝试清除缓存?检查您的sendToFavorites
是否声明为public
。检查VisitorMessageController::sendToFavorites的拼写是否使用JMSDiextrable?可能是这个bug:它肯定是公共的;我会更新描述使它更清楚。它肯定是公开的;我会更新描述使它更清楚。