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

时间:2014-01-07 04:13:42

标签: 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);

   }
}

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

Array
(
    [0] => AppController
    [1] => BoardsController
    [2] => TeamsController
    [3] => TypesController
    [4] => UsersController
)

然而pr($ action);什么...... :(

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

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

1 个答案:

答案 0 :(得分:11)

这样的事情可以解决这个问题: https://github.com/dereuromark/cakephp-sandbox/blob/master/Plugin/Sandbox/Controller/SandboxAppController.php#L12

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

$actions = get_class_methods($Controller);

然后获取父方法:

$parentMethods = get_class_methods(get_parent_class($Controller));

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

$actions = array_diff($actions, $parentMethods);

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