【问题标题】:Zend Framework Action Stack AlternativeZend 框架操作堆栈替代方案
【发布时间】:2011-03-19 20:36:53
【问题描述】:

Zend 中有没有一种方法可以从另一个控制器调用一个控制器?

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

我想要达到的效果如下:

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

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

我的想法是,我可以为我的应用程序创建模块,客户可以简单地拖放到适当的位置,系统会根据报告获取。

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

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

    如果您有一个 ReportController,让它接受任何输入并将其转发到 ReportsService 或模型中负责生成报告的其他东西。生成它们不是控制器的责任。

    它应该看起来像这样:

    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 不需要了解模块目录,因此您需要多考虑一下该服务的公共接口。但总的来说,这是要走的路。

    无论你做什么,都不要在控制器中进行。控制器应该很纤薄。

    【讨论】:

    • +1 胖控制器只属于英国铁路相关儿童节目
    • 这对我来说听起来很明智。非常感谢
    • 我登录是为了给你加分!谢谢你的好答案。还有一个很好的讨论,我想在这里提一下。 rmauger.co.uk/2009/03/…
    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2014-08-14
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多