CodeIgniter使用总结

最近在使用CodeIgniter开发一个企业站项目,一开始是把前台和后台分开做为两个单独的项目,但后来想一想为啥不能放在一个项目里呢,便有了改造的想法。php

先上一张最终的目录结构图git

application/
  |-- config/
  |     |-- routes.php
  |-- controllers/
  |     |-- backend/
  |     |-- frontend/
  |-- core/
  |     |-- MY_Controller.php
  |     |-- MY_Router.php
  |-- views/
  |     |-- backend/
  |     |-- frontend/
  |-- static/              
  |     |-- backend/
  |     |-- frontend/
  |-- index.php

这样设计的的好处:
一、目录结构清晰
二、保持了单入口index.phpgithub

controllers/backend和controllers/frontend目录下的控制器能够分别继承不一样的基类。好比:后台控制器继承基类Backend_Controller,前台控制器继承基类Frontend_Controller。
MY_Controller扩展核心系统类CI_Controller,能够根据业务须要添加一些公共功能。
Backend_Controller和Frontend_Controller均继承自MY_Controller。bash

那么问题来了,Backend_Controller和Frontend_Controller定义在哪里呢。答案以下:app

<?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源码frontend

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方法this

<?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
        ];
    }
}

Demo地址设计

相关文章
相关标签/搜索