Symfony Controller魔术方法?

时间:2015-05-28 19:43:54

标签: php symfony routing zikula

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

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,则可以创建一个侦听器来捕获它,并发送一个看起来像行为的响应,其行为类似于来自指定bundle的< / strong>即可。我们使用它来调用所有模块可用的模块服务,并在单独的模块中提供,但看起来它们由“主机”模块提供。

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

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

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

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

我尝试将当前的侦听器更改为控制器,并尝试向symfony的AbstractController扩展添加方法,但尚未实现我希望实现的目标。我希望能有一些关于新想法或方法的建议。

1 个答案:

答案 0 :(得分:0)

我放弃了尝试复制确切的行为,因为它似乎不可能(这也很难描述)。所以我采用了标准路线的普通控制器,但我找到了一种方法,使其看起来属于原来的主机&#39;模块。感谢Gerry,ggioffreda和DerStoffel提供的想法。