php - Symfony Controller 魔术方法?

标签 php symfony routing zikula

我正在尝试使用 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/

相关文章:

PHP 的 asort 不能正常工作?

javascript - 使用js延迟函数时使用ISSET验证表单

symfony - 根据日期和时间对 Symfony 中的对象数组进行排序

css - 将类添加到 symfony 复选框的子集

ruby-on-rails - Rails 路线 : optional parameters in resourceful routes

php - 我的路线返回 404,我该如何修复它们?

php - 将 HTML 属性从 onclick 事件传递给 jQuery 函数

symfony - Doctrine ordering to many associations and matching Criteria

php - 根据 Laravel 中的上一页重定向到不同的页面

php - Mysql 查询获取共同好友计数并将其显示在 php 的表中