如何在cakephp中获取控制器内所有函数的列表

Scr*_*cco 11 php cakephp cakephp-2.0

我需要在CakePHP 2.4中选择一个控制器并显示其中写的所有函数.我找到了如何从Stack Overflow上的问题和答案线程中列出控制器,但我现在需要的是一个特定的控制器,我需要获得它包含的所有函数的列表.

在这里我做了什么

public function getControllerList() {

   $controllerClasses = App::objects('controller');
   pr($controllerClasses);
   foreach($controllerClasses as $controller) { 

      $actions = get_class_methods($controller);
      echo '<br/>';echo '<br/>';
      pr($actions);

   }
}
Run Code Online (Sandbox Code Playgroud)

PR($ controllerClasses); 给我控制器列表如下

Array
(
    [0] => AppController
    [1] => BoardsController
    [2] => TeamsController
    [3] => TypesController
    [4] => UsersController
)
Run Code Online (Sandbox Code Playgroud)

但是pr($ actions); 没有... :(

在这里,你按照我需要的方式去最后的工作片段

http://www.cleverweb.nl/cakephp/list-all-controllers-in-cakephp-2/

public function getControllerList() {

        $controllerClasses = App::objects('controller');
        foreach ($controllerClasses as $controller) {
            if ($controller != 'AppController') {
                // Load the controller
                App::import('Controller', str_replace('Controller', '', $controller));
                // Load its methods / actions
                $actionMethods = get_class_methods($controller);
                foreach ($actionMethods as $key => $method) {

                    if ($method{0} == '_') {
                        unset($actionMethods[$key]);
                    }
                }
                // Load the ApplicationController (if there is one)
                App::import('Controller', 'AppController');
                $parentActions = get_class_methods('AppController');
                $controllers[$controller] = array_diff($actionMethods, $parentActions);
            }
        }
        return $controllers;
    }
Run Code Online (Sandbox Code Playgroud)

mar*_*ark 11

像这样的东西应该做的伎俩:https: //github.com/dereuromark/cakephp-sandbox/blob/master/Plugin/Sandbox/Controller/SandboxAppController.php#L12

它基本上使用了一个非常基本的PHP函数:

$actions = get_class_methods($Controller);
Run Code Online (Sandbox Code Playgroud)

然后获取父方法:

$parentMethods = get_class_methods(get_parent_class($Controller));
Run Code Online (Sandbox Code Playgroud)

最后,使用array_diff,您将获得该控制器中的实际操作:

$actions = array_diff($actions, $parentMethods);
Run Code Online (Sandbox Code Playgroud)

然后,您仍然可以过滤掉不需要的操作.