我偶然发现了这件事: 给定一个特定的路由,symfony调用父控制器类操作方法而不是childes。
routing.yml
尽可能简单:
new_message_favorites:
#there are no routes defined like this with optional parameters
pattern: /messages/new/fans
defaults: { _controller: BigBundle:VisitorMessages:sendToFavorites }
应该处理请求的类称为VisitorMessagesController
,操作方法称为sendToFavoritesAction
,如您所料:
class MessagesController {
//this one gets called
public function sendToFavoritesAction(Request $request) { [...] }
}
class VisitorMessagesController extends MessagesController {
//instead of this
public function sendToFavoritesAction(Request $request) { [...] }
}
它们都没有被定义为服务,它们都位于正确的命名空间和文件夹中,但是当打开网址时,父节点操作会被调用而不是VisitorMessagesController
版本。
注意:MessagesControlled没有动作方法的基本版本,但后来我得到了#34; Controller方法不可调用"错误,这就是我如何发现symfony试图调用父方法。
为什么会这样?
更新
在symfony LOG中,如果我在父方法中出错,它会显示正确的路线
INFO - Matched route "new_message_favorites" (parameters: "_controller": "BigBundle\Controller\VisitorMessagesController::sendToFavoritesAction", "_locale": "en", "_route": "new_message_favorites")
但是如果我从父类中删除该方法,那么它会给出ReflectionException
该方法不存在...
Method BigBundle\Controller\MessagesController::sendToFavoritesAction() does not exist
UPDATE2:
有4种不同的方法映射到VisitorMessagesController
中的路由,并且所有这些方法都以某种方式映射到父类。
UPDATE3:
我重新创建了抛出异常的条件Symfony\Component\HttpKernel\Controller\ControllerResolver
:
$callable = [new VisitorMessagesController(), 'sendToFavoritesAction'];
if (!is_callable($callable)) { throw Ex }
奇怪的是,在ControllerResolver
这解析为 false 会导致异常,但其他Controller中的相同内容会解析为 true
答案 0 :(得分:1)
如果您未将方法sendToFavorites
声明为公开,则会发生此错误。因此内核无法调用它。请检查这一点。
答案 1 :(得分:1)
jms / di-extra-bundle中存在导致此错误的已知问题:请参阅https://github.com/schmittjoh/JMSDiExtraBundle/issues/186
答案 2 :(得分:0)
sendToFavorites
。