Bonjour,
Je cherche un moyen simple pour afficher les methodes liées a un controller sur une seule page ?

4 réponses


Bonjour.
Je suppose que tu veux parler des actions (functions).
Par contre tu n'en dis pas assez, nous ne savons pas si tu veux inclure également les fonctions avec des prefixes, comme admin_.

Ou encore si tu veux intégrer aussi la fonction index ou non.
Donc, dis nous en un peu plus.

Bonsoir, j'avais eu besoin de faire cela il y a longtemps: J'ai remis la main sur le code:

/**
** Liste toutes les actions de tous les controllers, (sauf AppController)
** $excludePlugin : array comprenant le nom des plugins à exclure de la liste
** $excludeActions : le nom des actions à ne pas prendre en compte
**/
public function getAllControllersAndActionInCakePhpApp($excludePlugin=array(),$excludeActions = array()){
    $controllers = $this->getAllController($excludePlugin);
    $results  = array();
    foreach($controllers as $base=>$controllersList){
    foreach($controllersList as $nameController){
        $results[$base][$nameController] = $this->getActionsFromController($base,$nameController,$excludeActions);
    }

   }

return $results;

}
/**
* Permet de lister les noms des fichiers php d'un repertoire
**/
public function getControllerNamesFromFolder($folder){
    if(is_dir($folder)){
           $scanFolder = scandir($folder);
    $names = array();
    foreach($scanFolder as $file){
        if("php" == pathinfo($file, PATHINFO_EXTENSION) && basename($file,".php") != "AppController"){
            $names[] = basename($file,".php");
        }
    }
    return $names; 
    }

}

/**
* Liste tous les controllers, y compris des plugins, sauf si dans $excludePlugins
*/
public function getAllController($excludePlugins = array()){
    $baseController = APP.DS."Controller";
    $controllers = array();
    $controllers["BASE"] = $this->getControllerNamesFromFolder($baseController);
    $basePlugin = APP.DS."Plugin";
    $scanPlugin = scandir($basePlugin);

    foreach($scanPlugin as $pluginName){
        $current = $basePlugin.DS.$pluginName.DS."Controller";
        if(is_dir($current) && substr($pluginName,0,1) != "." && !in_array($pluginName,$excludePlugins)){
            $controllers[$pluginName] = $this->getControllerNamesFromFolder($current);
        }
    }
    return $controllers;
}
/*
*Liste les actions pour un controller donnée.$base = "BASE" pour non plugin
*/
public function getActionsFromController($base,$controller,$excludeActions=array()){
    if($base == "BASE"){
         App::uses($controller, 'Controller');
     }else{
        App::uses($controller, $base.'.Controller');
     }
         $class = new ReflectionClass($controller);
         $allMethods = $class->getMethods(ReflectionMethod::IS_PUBLIC);
         $methods = array();
         foreach($allMethods as $v){
             if($v->class == $controller && !in_array($v->name,$excludeActions)){
                $methods[] = $v->name;
            }
         }

    return $methods;

}

@antho07 : Il y a beaucoup plus simple et plus court, pour ma part, j'attends qu'il réponde à mon post pour lui proposer une solution.

sans doute, ça sort du fond de tiroir ce truc mais ça doit faire son taff