Symfony控制器的魔术方法?

3

我正在尝试使用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中,但尚未实现我所希望的目标。我希望能够得到一些新思路或尝试的方法的建议。

1
不要这样做。在Symfony 2中删除此类内容的原因是有充分的理由的。 - Emii Khaos
1
@Paziツ 这是否意味着在Symfony 1中是可能的?您有关于此功能和/或为什么被删除的任何参考资料吗? - Christian
我没有使用过Symfony 1,也从未使用过。正如我所提到的,我正在尝试使用Symfony来复制一个在不同/旧框架中的功能。 - craigh
你可以编写一个Symfony异常监听器,监听NotFoundHttpException,然后执行你想要做的任何操作。 - Gerry
让我来澄清一下,您想要的不是使用Symfony的标准方式,即在控制器中创建一个操作并简单地将路由与其关联,而是希望:当抛出了您没有将其与控制器中的操作相关联的路由时,监听异常,以便您可以将其与控制器中的操作相关联以调用它?也许在这种情况下需要一些关于大局的话。要将旧框架路由转换为Symfony,可能只需要在您喜欢的Web服务器中设置一对重写。 - ggioffreda
你可以编写一个动作,使用参数查找sf路由。但这只能是一个临时解决方案,直到你真正能够直接获取sf路由为止。看一下SF2的HttpFoundation/Request对象,你可以从中提取所有参数并构建路由...不过这似乎非常不对。为什么不使用app.php/foo/bar/zip呢? - DerStoffel
1个回答

1

我放弃了尝试复制完全相同的行为,因为这似乎是不可能的(而且很难描述)。所以我已经转向使用普通控制器和标准路由,但我找到了一种方法使其看起来属于原始的“主机”模块。感谢Gerry、ggioffreda和DerStoffel提供的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接