<?php class Utils_ZFApplicationExplorer { /** * Explore les modules du MVC à la recherche de tous les controllers et leurs actions * et retourne toutes ces infos dans un tableau: * $modulesInfo['modules'][$modName]['controllers'][$ctrlName]['actions'][] = $actionName ; * @return array Un tableau avec les modules, leurs controllers et leurs actions. */ public static function exploreControllers() { $zcf = Zend_Controller_Front::getInstance(); //Zend_Debug::dump($zcf, 'FrontController:'); $defaultModuleName = $zcf->getDefaultModule(); $modulesInfo = array( 'defaultModuleName' => $defaultModuleName , 'defaultControllerName' => $zcf->getDefaultControllerName(), 'defaultAction' => $zcf->getDefaultAction(), 'modules'=>array() ); $dirs = $zcf->getControllerDirectory(); //Zend_Debug::dump($dirs, 'Folders des controllers:'); $matches = null ; foreach( $dirs as $modName => $modControllersPath ) { $modName = strtolower($modName); $modulesInfo['modules'][$modName] = array( 'controllersPath' => $modControllersPath, 'controllers' => array() ); if( ! ($dh = opendir($modControllersPath)) ) { continue ; } while( ($file = readdir($dh)) !== false ) { if( ! preg_match('/(.*)Controller.php$/', $file, $matches ) ) { continue ; } $ctrlName = strtolower($matches[1]); $ctrlClassName = $ctrlName .'Controller' ; $filePath = $modControllersPath.DIRECTORY_SEPARATOR.$file ; // Si ce n'est pas le module par défaut, // le nom de la classe doit être préfixé par le nom du module. if( $modName != $defaultModuleName ) { $ctrlClassName = $modName.'_'.$ctrlClassName ; } $modulesInfo['modules'][$modName]['controllers'][$ctrlName] = array( 'controllerClass' => $ctrlClassName, 'actions' => array() ); require_once($filePath); if( ! class_exists($ctrlClassName) ) { $fileReflect = new Zend_Reflection_File($filePath); // Ici il peut y avoir un problème de nom de classe // causé par un problème de casse de caractère. $class = $fileReflect->getClass($ctrlClassName); } else { $class = new Zend_Reflection_Class( $ctrlClassName ); } $methods = $class->getMethods(); //Zend_Debug::dump($methods); foreach( $methods as $k => $methodInfo ) { if( ! preg_match('/(.*)Action$/',$methodInfo->name,$matches) ) { continue ; } $actionName = strtolower($matches[1]); // on $r = new Zend_Reflection_Method($ctrlClassName, $methodInfo->name); try { $docblock = $r->getDocblock(); $shortDescription = $docblock->getShortDescription(); $longDescription = $docblock->getLongDescription(); } catch (Exception $e) { $longDescription = $shortDescription = ''; } $modulesInfo['modules'][$modName]['controllers'][$ctrlName]['actions'][$actionName] = array( 'action' => $actionName, 'pageId' => $modName.'/'.$ctrlName.'/'.$actionName, 'shortDescription' => $shortDescription, 'longDescription' => $longDescription ); ; } } closedir($dh); } return $modulesInfo ; } }