如果你想创建一个自定义的基本控制器并让其他控制器在那里扩展,你可以通过以下方式进行:
在文件夹中创建MY_Controller
扩展并使其他控制器扩展为将从核心自动加载(我猜你已经知道但想要其他替代方案。CI_Controller
application/core/
MY_Controller
MY_Controller
在. MY_Controller
_ application/core/
然后创建其他级别的控制器,主要是Admin_Controller
和Frontend_Controller
。现在,这些控制器之一将为您实际使用的控制器奠定基础。
例如在application/core/MY_Controller.php
class MY_Controller extends CI_Controller {
public function __construct(){
parent::__construct();
}
}
然后 Admin 和 Frontend 控制器将被创建application/libraries/
并扩展MY_Controller
为
class Admin_Controller extends MY_Controller {
public function __construct(){
parent::__construct();
}
}
现在,任何控制器都可以扩展这 2 个控制器之一,但为此您必须自动加载它们。在这种情况下,自动加载可能会造成混淆,因为在 config/autoload.php 中设置 autoload['libraries'] 将不起作用。该自动加载在控制器内部工作,但在这里我们需要在此之前自动加载,即在类声明中。需要将此代码设置为config/config.php
function __autoload($class)
{
$path = array('libraries');
if(strpos($class, 'CI_') !== 0) {
foreach($path as $dir) {
$file = APPPATH.$dir.'/'.strtolower($class).'.php';
if (file_exists($file) && is_file($file))
@include_once($file);
}
}
}
现在您可以创建自己的控制器
class newController extends Admin_Controller
{
}
这是使您的结构非常干净和有效的最建议的方法。第一次理解可能需要一些努力,但绝对值得。
- 第三种方法只是第二种方法的调整,仅基于您提到的不使用条件
MY_Controller
您可以直接制作Admin_Controller
或Frontend_Controller
扩展CI_Controller
而不是扩展MY_Controller
如果可能是这种情况,这可能只会导致这两个控制器中的一些代码重复