2011-03-18 22 views
2

Zend有沒有辦法從另一個控制器中調用一個控制器?Zend Framework Action Stack Alternative

我已經看到了動作堆棧,但似乎並沒有爲我工作,我已經讀了很多人認爲它是邪惡的!

什麼,我想acchive如下:

報告控制器通過掃描系統中的所有模塊,它會檢查,看是否有路由已經註冊該模塊稱爲MODULENAME的報告運行

然後控制器重新執行該註冊路由以生成來自所有模塊的所有報告。

這個想法是,我可以爲我的應用程序創建模塊,客戶可以簡單地拖放到位,並且系統會在報告中選取。

回答

6

你的控制器不應該做任何這些事情。您的控制器只應接受來自用戶界面的任何輸入,然後決定將其委託給模型中的相應類。

如果您有一個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的應該需要知道的關於模塊目錄,所以你會想給該服務更有些人認爲的公共接口。但總的來說,這是一條路。

不管你做什麼,都不要在控制器裏做。管制員應該很苗條。

+2

+1脂肪控制器只屬於英國鐵路有關的兒童節目 – Phil 2011-03-18 12:58:07

+0

這聽起來很明智。非常感謝您 – 2011-03-18 13:22:17

+0

我已經登錄了,爲您提供了分數!謝謝你的回答。關於這個我想在這裏提到一個很好的討論。 http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/ – kta 2014-05-18 05:59:42