我正在尝试使用Symfony来复制现有框架(zikula)中的行为。该框架可通过模块进行扩展,这些模块基本上是扩展的Symfony bundles。旧框架的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,您可以创建一个监听器来捕获它并发送一个看起来和行为像来自指定捆绑包的响应。我们使用这个方法来调用所有模块都可用且在单独的模块中提供的模块服务,但看起来它们是由“主机”模块提供的。
现在我正在尝试使用Symfony和路由复制这个过程。
第一个问题是生成一个技术上不存在的路由,这是可能的吗?
第二个问题是如何捕获RouteNotFoundException(我知道如何做到这一点,因为我们已经为其他异常设置了监听器)。
最后一个问题是让它看起来像是捆绑包提供了响应,当实际上它是由一个事件监听器(或其他东西)提供的。这最后一个部分很重要,因为响应中的其他内容需要来自模块/捆绑包。
我已经尝试将当前的监听器更改为控制器,并且还尝试将方法添加到我们扩展Symfony的AbstractController中,但尚未实现我所希望的目标。我希望能够得到一些新思路或尝试的方法的建议。