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

时间:2016-09-26 13:01:10

标签: symfony inheritance controller routing

我偶然发现了这件事: 给定一个特定的路由,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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

jms / di-extra-bundle中存在导致此错误的已知问题:请参阅https://github.com/schmittjoh/JMSDiExtraBundle/issues/186

答案 2 :(得分:0)

  1. 删除symfony cache / dev目录以确保这不是缓存问题。
  2. 如果此路线没有额外声明,则在整个项目中搜索sendToFavorites
  3. 我也会说这是一个错字,但如果你说你多次检查它......