【问题标题】:Symfony Controller magic method?Symfony Controller 魔术方法?
【发布时间】:2015-05-28 19:43:53
【问题描述】:

我正在尝试使用 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 扩展中,但还没有达到我希望达到的效果。我希望有一些关于新想法或尝试方法的建议。

【问题讨论】:

  • 不要那样做。有一个很好的理由,为什么这些东西在 symfony 2 中被删除了。
  • @Paziツ 这是否意味着它在 Symfony 1 中是可能的?您是否对此功能有任何参考和/或为什么将其删除?
  • 我没有使用 Symfony 1,也从未使用过。正如我所提到的,我正在尝试使用 Symfony 在 不同/旧 框架中复制一个功能。
  • 你可以编写一个 Symfony 异常监听器并监听 NotFoundHttpException,然后做你想做的任何事情。
  • 让我直截了当,而不是使用 Symfony 中的标准方法,即在控制器中创建一个动作并简单地将一个路由关联到它,你想要: 在路由时监听异常你没有关联到控制器中的动作被抛出,所以你可以将它关联到控制器中的动作来调用它?在这种情况下,也许需要一些大局的字眼。要为 Symfony 翻译旧的框架路由,可能只需在您最喜欢的 Web 服务器中设置几个重写。

标签: php symfony routing zikula


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2023-03-14
    • 2010-10-27
    相关资源
    最近更新 更多