2

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

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,您可以创建一个侦听器来捕获它并发送一个看起来和行为都像是来自指定捆绑包的响应。我们使用它来调用所有模块都可用并在单独的模块中提供的模块服务,但看起来它们是由“主机”模块提供服务的。

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

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

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

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

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

4

1 回答 1

0

我放弃了尝试复制确切的行为,因为这似乎是不可能的(也很难描述)。因此,我使用了具有标准路由的普通控制器,但我找到了一种让它看起来属于原始“主机”模块的方法。感谢 Gerry、ggiofreda 和 DerStoffel 提供的想法。

于 2015-05-29T19:24:53.813 回答