php - Zend 框架操作堆栈替代方案

标签 php zend-framework

Zend 中有一种方法可以从一个 Controller 调用另一个 Controller 吗?

我看过 Action 堆栈,但这似乎对我不起作用,而且我读到很多人认为它是邪恶的!

我想要实现的目标如下:

报告 Controller 扫描系统中的所有模块,然后检查是否已为名为 MODULENAME-reports-run 的模块注册了路由

然后 Controller 重新运行该注册的路由以生成来自所有模块的所有报告。

我的想法是,我可以为我的应用程序创建模块,客户端可以简单地将其拖放到适当的位置,然后系统会根据报告进行选择。

最佳答案

你的 Controller 不应该做任何这些事情。您的 Controller 应该只接受来自用户界面的任何输入,然后决定将其委托(delegate)给模型中适当的类。

如果您有 ReportController,请让它接受任何输入并将其转发到 ReportsService 或模型中负责生成报告的其他内容。生成它们不是 Controller 的责任。

它应该看起来像这样:

public function generateReportAction()
{
    try {
        $service = new Model_ReportService;
        $service->setReportToGenerate($this->getRequest()->getParam('reportId'));
        $this->view->report = $service->generateReport();
    } catch (ReportException $e) {
        // do something with $e
    }
}

如果您的 ReportService 需要生成多个报告,请更改 ReportService,以便它知道如何执行此操作。你可以做类似的事情

$service = new Model_ReportService;
$service->setModulesDirectory('something');
$this->view->reports = $service->generateReportsForModules();

我个人认为 ReportService 不需要了解模块目录,因此您需要更多地考虑该服务的公共(public)接口(interface)。但总的来说,这是要走的路。

无论你做什么,都不要在 Controller 中进行。 Controller 应该很薄。

关于php - Zend 框架操作堆栈替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351933/

相关文章:

php - Laravel Cashier paymentMethods() 总是返回空对象结果

php - UTF8 到 php 中的等效数字

zend-framework - 删除 Controller 中的元素描述 (Zend_Form)

javascript - jQuery `submit` 方法忽略使用 GET 发送的 POST。为什么?

php - 在mysql中选择除一个字段之外的所有字段

php - MySQL无法执行

javascript - 为什么 json_encode 必须出现在 php 文件中而不是出现在外部 javascript 文件中?

php - 设置 symfony 单元测试

zend-framework - 使用命名路由的Zend Form SetAction

zend-framework - Zend 邮件无法在亚马逊服务器上运行