最近在使用CodeIgniter开发一个企业站项目,一开始是把前台和后台分开作为两个单独的项目,但后来想想为啥不能放在一个项目里呢,便有了改造的想法。
先上一张最终的目录结构图
application/
|-- config/
| |-- routes.php
|-- controllers/
| |-- backend/
| |-- frontend/
|-- core/
| |-- MY_Controller.php
| |-- MY_Router.php
|-- views/
| |-- backend/
| |-- frontend/
|-- static/
| |-- backend/
| |-- frontend/
|-- index.php
这样设计的的好处:
1、目录结构清晰
2、保持了单入口index.php
controllers/backend和controllers/frontend目录下的控制器可以分别继承不同的基类。比如:后台控制器继承基类Backend_Controller,前台控制器继承基类Frontend_Controller。
MY_Controller扩展核心系统类CI_Controller,可以根据业务需要添加一些公共功能。
Backend_Controller和Frontend_Controller均继承自MY_Controller。
那么问题来了,Backend_Controller和Frontend_Controller定义在哪里呢。答案如下:
<?php
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
}
/**
* 后台基类
* Class Backend_Controller
*/
class Backend_Controller extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
}
/**
* 前台基类
* Class Frontend_Controller
*/
class Frontend_Controller extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
}
不指定任何控制器时,希望能够访问默认控制器,所以我们去设置$route['default_controller'] = 'frontend/XXX';但是访问会提示404错误,到底是因为什么原因呢。
查看system/core/Router.php源码
if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2)
{
$method = 'index';
}
if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php'))
{
// This will trigger 404 later
return;
}
关键在于定义MY_Router类,重写_set_default_controller方法
<?php
class MY_Router extends CI_Router {
protected function _set_default_controller() {
if(empty($this->default_controller)) {
show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');
}
if(sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2)
{
$method = 'index';
}
if(is_dir(APPPATH.'controllers/'.$class)) {
$this->set_directory($class);
$class = $method;
if (sscanf($method, '%[^/]/%s', $class, $method) !== 2) {
$method = 'index';
}
}
if(!file_exists(APPPATH . 'controllers/' . $this->directory.ucfirst($class) . '.php')) {
return;
}
$this->set_class($class);
$this->set_method($method);
$this->uri->rsegments = [
1 => $class,
2 => $method
];
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。