设为首页收藏本站
查看: 80|回复: 0

[PHP] codeigniter框架开发技巧

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2014-3-27 00:19:00 | 显示全部楼层 |阅读模式
    (1)自动加载models——php5风格
    使用这个技巧以后,我们将能够直接创建这个model对象。
    这个代码是简洁的并且容易理解对象。
        使用这个技巧以后会有2个影响。首先你不再需要继承model类了。
    这个技巧
    我们需要做的就是添加一个php5风格的 autolader 函数
    添加这些代码到system/application/config/config.php:
    // ...  
    function __autoload($class) {  
        if (file_exists(APPPATH."models/".strtolower($class).EXT)) {  
            include_once(APPPATH."models/".strtolower($class).EXT);  
        }  
    }  
    ?>
    如果你也有兴趣运用这个技巧到controller,你只需要添加以下代码来代替上面的代码。

    // ...  
    function __autoload($class) {  
        if (file_exists(APPPATH."models/".strtolower($class).EXT)) {  
            include_once(APPPATH."models/".strtolower($class).EXT);  
        } else if (file_exists(APPPATH."controllers/".strtolower($class).EXT)) {  
            include_once(APPPATH."controllers/".strtolower($class).EXT);  
        }  
    }  
    ?>
    任何时候,你试着使用一个没有定义的类时候,这个__autoload函数将会被调用,它将会加载这个类文件。
    (2)防止model-controller名字冲突
    使用这个技巧要达到的目标:
    一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。
    class Post extends Model {  
        // ...  
    }
    现在你就不能有一个像这样的url:
    http://www.mysite.com/post/display/13
    这个原因是因为你也需要有一个名字为post的controller,如果创建了这样的一个类的话将会引起致命错误。
    但是使用了这个技巧一般,一切皆有可能。那个url的控制器看起来是这样的:
    // application/controllers/post.php  
    class Post_controller extends Controller {  
        // ...  
    }
    注意这个“__controller”后缀
    技巧:
    为了避免这个问题,通常大多数人都是添加‘_model’后缀到model名字(例如命名Post_model)。
    在所有的应用程序中Model对象都被创建和引用,所以在所有的model名字后面跟上‘_model’有些无聊。
    我认为最好的办法就是在controller上来添加后缀,因为在代码中controller的名字几乎从来不会被引用。
    首先我们需要继承Router class。创建这样一个文件:"application/libraries/MY_Router.php"
    class MY_Router extends CI_Router {  
        var $suffix = '_controller';  
        function MY_Router() {  
            parent::CI_Router();  
        }  
        function set_class($class) {  
            $this->class = $class . $this->suffix;  
        }  
        function controller_name() {  
            if (strstr($this->class, $this->suffix)) {  
                return str_replace($this->suffix, '', $this->class);  
            }  
            else {  
                return $this->class;  
            }  
        }  
    }  
    现在编辑"system/codeigniter/CodeIgniter.php"
    第153行
    if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT))  
    然后第158行
    include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->controller_name().EXT);  
    然后编辑"system/libraries/Profiler.php"的第323行
    $output .= "div style="color:#995300;font-weight:normal;padding:4px 0 4px 0">".$this->CI->router->controller_name()."/".$this->CI->router->fetch_method()."
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表