Zend框架动作堆栈替代

Lee*_*lan 2 php zend-framework

Zend有没有办法从另一个控制器调用一个控制器?

我已经看过动作堆栈,但这对我来说似乎没有用,我读过很多人认为它是邪恶的!

我想要实现的目的如下:

报告控制器扫描系统中的所有模块,然后检查是否已为该模块注册了一个名为MODULENAME-reports-run的路径

然后控制器重新注册该注册路由以生成来自所有模块的所有报告.

我的想法是,我可以为我的应用程序创建模块,客户端可以简单地拖放到系统中,系统会接收报告.

Gor*_*don 6

你的控制器不应该做任何这些事情.您的控制器应该只接受来自用户界面的任何输入,然后决定将其委托给模型中的相应类.

如果您有ReportController,请让它接受任何输入并将其转发到ReportsService或负责生成Reports的Model中的其他内容.生成它们不是控制器的责任.

它应该看起来像这样:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的ReportService需要生成多个报告,请更改ReportService,以便它知道如何执行此操作.你可以做点什么

$service = new Model_ReportService;
$service->setModulesDirectory('something');
$this->view->reports = $service->generateReportsForModules();
Run Code Online (Sandbox Code Playgroud)

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

无论你做什么,都不要在控制器中做到这一点.控制器应该很苗条.

  • +1 Fat控制器仅属于英国铁路相关儿童节目 (2认同)