Symfony 控制器魔术方法?

Symfony Controller magic method?

我正在尝试使用 Symfony 复制现有框架 (zikula) 中的行为。这个框架可以使用模块进行扩展,这些模块基本上是扩展的 symphony 包。旧框架有 url 是这样的

index.php?module=foo&type=bar&func=zip

在 symfony 中大致翻译为

index.php?bundle=foo&controller=bar&method=zip

框架有一个 AbstractController,它有一个神奇的方法:

public function __call($method, $args)
{
    $event = new \Zikula\Core\Event\GenericEvent($this, array('method' => $method, 'args' => $args));
    $this->eventManager->dispatch('controller.method_not_found', $event);
    if ($event->isPropagationStopped()) {
        return $event->getData();
    }
}

因此,如果您使用捆绑包中不存在的方法创建了一个 url,您可以创建一个侦听器来捕获它并发送一个响应 看起来和行为就像它来自指定的包。我们使用它来调用模块服务,这些服务可用于所有模块并在单独的模块中提供,但看起来它们是由 'host' 模块提供的。

现在我正在尝试使用 symfony 和路由来复制它。

第一个问题是生成技术上不存在的路由。这可能吗?

第二个问题是捕获 RouteNotFoundException(我知道该怎么做,我们已经有了其他异常的侦听器)。

最后一个问题是,当事件侦听器(或其他东西)实际提供响应时,它看起来像是包正在提供响应。最后一部分很重要,因为响应中的其他内容需要来自 module/bundle.

我试过将当前侦听器更改为控制器,还尝试向我们对 symfony 的 AbstractController 的扩展添加一个方法,但还没有实现我希望实现的目标。我希望得到一些关于新想法或方法的建议。

我放弃了尝试复制确切的行为,因为它似乎是不可能的(它也很难描述)。所以我求助于一个带有标准路由的普通控制器,但我找到了一种方法让它看起来属于原来的 'host' 模块。感谢 Gerry、ggioffreda 和 DerStoffel 提供的想法。