【问题标题】:List all controllers/actions in Cakephp 3列出 Cakephp 3 中的所有控制器/动作
【发布时间】:2014-09-17 13:55:34
【问题描述】:

如何列出我网站上的所有控制器/操作? Configure::listObjects('model') 似乎不再存在。我正在尝试编写一个函数来生成/添加到我的 ACL 设置中的 ACO。谢谢。

【问题讨论】:

    标签: cakephp acl cakephp-3.0


    【解决方案1】:

    这就是我所做的。在我的资源控制器中:

    包括反射类/方法库

    use ReflectionClass;
    use ReflectionMethod;
    

    获取控制器:

    public function getControllers() {
        $files = scandir('../src/Controller/');
        $results = [];
        $ignoreList = [
            '.', 
            '..', 
            'Component', 
            'AppController.php',
        ];
        foreach($files as $file){
            if(!in_array($file, $ignoreList)) {
                $controller = explode('.', $file)[0];
                array_push($results, str_replace('Controller', '', $controller));
            }            
        }
        return $results;
    }
    

    现在开始行动:

    public function getActions($controllerName) {
        $className = 'App\\Controller\\'.$controllerName.'Controller';
        $class = new ReflectionClass($className);
        $actions = $class->getMethods(ReflectionMethod::IS_PUBLIC);
        $results = [$controllerName => []];
        $ignoreList = ['beforeFilter', 'afterFilter', 'initialize'];
        foreach($actions as $action){
            if($action->class == $className && !in_array($action->name, $ignoreList)){
                array_push($results[$controllerName], $action->name);
            }   
        }
        return $results;
    }
    

    最后,将两者联系在一起:

    public function getResources(){
        $controllers = $this->getControllers();
        $resources = [];
        foreach($controllers as $controller){
            $actions = $this->getActions($controller);
            array_push($resources, $actions);
        }
        return $resources;
    }
    

    我希望这对某些人有所帮助。

    【讨论】:

      【解决方案2】:

      看起来在 Cake3 中没有类似的东西仍然可用,由于我认为命名空间,它也不再需要。

      所以简而言之,您可以尝试这样做:

      • 从应用级控制器文件夹中读取所有控制器
      • 读取所有插件控制器文件夹(通过Plugin::path()获取插件文件夹)
      • 遍历您在前面步骤中收集的控制器(您需要使用 App::uses())
      • 使用reflections从每个控制器获取公共方法

      【讨论】:

        【解决方案3】:

        我使用的是 CakePHP 3.x,但函数“getActions”有问题

        “ReflectionClass”和“ReflectionMethod”的正确语法是:

            public function getActions($controllerName) {
        
            $className = 'App\\Controller\\'.$controllerName.'Controller';
        
            $class = new \ReflectionClass($className);
        
            $actions = $class->getMethods(\ReflectionMethod::IS_PUBLIC);
        
            $results = [$controllerName => []];
        
            $ignoreList = ['beforeFilter', 'afterFilter', 'initialize'];
        
            foreach($actions as $action){
                if($action->class == $className && !in_array($action->name, $ignoreList)){
                    array_push($results[$controllerName], $action->name);
                }
            }
            return $results;
        }
        

        ReflectionClass 和 ReflectionMethod 之前的“\”警告。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-27
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-21
          相关资源
          最近更新 更多