2011-03-18 4 views
2

Y at-il un moyen dans Zend d'appeler un contrôleur d'un autre?Zend Framework Action Stack Alternative

J'ai vu la pile d'action mais cela ne semble pas fonctionner pour moi et j'ai lu que beaucoup de gens pensent que c'est MAL!

Ce que je suis en train de acchive se présente comme suit:

Rapports scanne Controller à travers tous les modules du système, il vérifie ensuite si un itinéraire a été enregistré pour ce module appelé MODULENAME-rapports-exécution

Le contrôleur réexécute alors cette route enregistrée pour générer tous les rapports de tous les modules. L'idée est que je peux créer des modules pour mon application que les clients peuvent simplement faire glisser et déposer en place et le système prend sur les rapports.

Répondre

6

Votre contrôleur ne doit rien faire de ce genre. Votre contrôleur ne doit accepter que les entrées de l'interface utilisateur, puis décider de les déléguer aux classes appropriées de votre modèle.

Si vous avez un ReportController, acceptez-le et transmettez-le à un ReportService ou à un autre élément du modèle responsable de la génération de rapports. Ce n'est pas la responsabilité des contrôleurs de les générer.

Il devrait ressembler à ceci:

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 
    } 
} 

Si votre ReportService doit générer plusieurs rapports, changer le ReportService donc il sait comment faire. Vous pouvez faire quelque chose comme

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

Personnellement, je ne pense pas que d'un ReportService devrait devez savoir sur un répertoire de module, de sorte que vous voulez donner l'interface publique de ce service un peu plus pensé. Mais en général, c'est la voie à suivre.

Quoi que vous fassiez, ne le faites pas dans le contrôleur. Les contrôleurs doivent être minces.

+2

+1 Les contrôleurs de graisse n'appartiennent qu'à la programmation pour enfants de British Rail – Phil

+0

Cela me semble logique. Merci beaucoup –

+0

Je me suis connecté pour vous donner une note! Merci pour une bonne réponse. Il y a aussi une bonne discussion à ce sujet que je voudrais mentionner ici. http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/ – kta