gpt4 book ai didi

php - Symfony Controller 魔术方法?

转载 作者:行者123 更新时间:2023-12-05 06:44:09 26 4
gpt4 key购买 nike

我正在尝试使用 Symfony 复制现有框架 (zikula) 中的行为。这个框架可以使用模块进行扩展,这些模块基本上是扩展的 symphony 包。旧框架有这样的 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(我知道该怎么做,我们已经有了其他异常的监听器)。

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

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

最佳答案

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

关于php - Symfony Controller 魔术方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com