如何在codeigniter中列出所有控制器类名?

时间:2011-05-07 06:39:29

标签: php codeigniter

我想为我的网站后端创建具有访问级别的用户身份验证。我想获取并列出用于创建用户组创建的所有控制器类名称。

提前致谢,

洛根

2 个答案:

答案 0 :(得分:8)

最好的办法是明确地将它们写入新的配置文件中。

$config['controllers'] = array(
    'blog',
    'events',
    'news', // etc.
);

否则,您将扫描会占用资源的目录。但你可以这样做:

    $controllers = array();
    $this->load->helper('file');

    // Scan files in the /application/controllers directory
    // Set the second param to TRUE or remove it if you 
    // don't have controllers in sub directories
    $files = get_dir_file_info(APPPATH.'controllers', FALSE);

    // Loop through file names removing .php extension
    foreach (array_keys($files) as $file)
    {
        $controllers[] = str_replace(EXT, '', $file);
    }
    print_r($controllers); // Array with all our controllers

由于文件名与控制器名称匹配,现在您应该拥有所有控制器的数组。虽然有几个原因,但这并不完美,但应该适用于大多数设置。

我个人使用高度修改的目录结构,所以这对我来说不起作用,而且我也想忽略一些控制器。另一种选择是将结果缓存到文件中,但这是一个单独的教程。

我强烈建议在配置文件中定义它们,这样就可以存储与访问控制直接相关的其他有用信息,并避免递归扫描目录的巨大开销。

答案 1 :(得分:0)

另一种方法是你可能这样做是通过创建一个接口,然后你可以在你的身份验证系统中检查,例如,创建一个类似这样的类:

interface IAuthorizationRequired
{
     public function __auth();
}

现在创建你的控制器(伪)

class BlogController extends CI_Controller implements IAuthorizationRequired
{
     public function __auth()
     {
          /*Redirect or Custom*/
     }
}

在您的授权模块中,您加载当前控制器并执行以下操作:

if(($controller instanceof IAuthorizationRequired) && method_exists(array($controller,'__auth')))
{
     $authed = $controller->__auth();
     if(!$authed)
     {
         echo 'Authorization Failed';
         exit;
     }
}

在2.0中,您可以覆盖基本控制器并将方法__auth添加到该控制器,然后只需检查界面,然后运行身份验证。