如何在Codeigniter项目中获取所有控制器的数组?

ash*_*ash 2 php controller codeigniter

我想获得Codeiginiter项目中所有控制器的列表,这样我就可以轻松遍历每个控制器并添加已定义的路径.我似乎无法找到一种能让我得到我所追求的方法?

这是routes.php文件中我想访问该数组的代码片段: -

// I'd like $controllers to be dynamically populated by a method
//
$controllers = array('pages', 'users');

// Loop through each controller and add controller/action routes
//
foreach ($controllers as $controller) {
    $route[$controller] = $controller . '/index';
    $route[$controller . '/(.+)'] = $controller . '/$1';
}

// Any URL that doesn't have a / in it should be tried as an action against
// the pages controller
//
$route['([^\/]+)$'] = 'pages/$1';
Run Code Online (Sandbox Code Playgroud)

更新#1

为了解释我正在努力实现的目标......我有一个Pages控制器,其中包含about,contact-us,privacy等页面.这些页面都应该可以通过/ about,/ contact-us和/ privacy访问.所以基本上,可以访问Pages控制器中的任何操作/方法,而无需指定/ pages/<action>.

不知道我是否正确地走这条路?

Phi*_*eon 7

那么直接回答编码问题,你可以这样做:

foreach(glob(APPPATH . 'controllers/*' . EXT) as $controller)
{
    $controller = basename($controller, EXT);

    $route[$controller] = $controller . '/index';
    $route[$controller . '/(.+)'] = $controller . '/$1';
}
Run Code Online (Sandbox Code Playgroud)

Buuuuuut这可能不会成为最灵活的方法.

还有其他一些方法可以做到这一点.一个是创建一个MY_Router并插入

$this->set_class('pages'); 
$this->set_method($segments[0]);
Run Code Online (Sandbox Code Playgroud)

之前/而不是show_404();

这将发送/联系到/ pages/contact,但前提是没有控制器,方法,路由首先映射到.

OOOOOOORRRRRR使用模块化分离,并在主要routes.php中添加以下内容

$routes['404'] = 'pages';
Run Code Online (Sandbox Code Playgroud)

  • 3个很棒的选择.;-) (2认同)