程序员文档之外的发现

干货:php框架CodeIgniter工作前的准备

2016-11-01  本文已影响506人  __x

对于刚接触php或者接触php时间还短的同学来说,第一个来深度使用CI来构建自己的项目是既幸福又苦逼的。

那么幸福和苦逼又是从何而来?

幸福在于CI的安装和使用的便捷,在GitHub上下载CI包解压到服务器就可以开始编程生涯,并且它属于轻量级框架,封装的东西不是太多,正常一边编程一边学习足够了,个人感觉还是很适合新手的。

凡事有利就有弊,轻量级并且使用简单的同时会带来一系列的困扰,比如说在Controller中调用View层只要load->view()就可以,如果有固定的头尾部的话还可以把页面拆分成Header.php和Footer.php来分别引用,很简单但又比较麻烦,引用情况较多的情况下代码看起来会很闹心,像这样:

$this->load->view("header");
$this->load->view("index");
$this->load->view("footer");

不便之处显而易见,上网查看了很多类似template模板的拓展类,但是都不尽如人意。

后来想到了Controller继承类,可以在application/core 中创建基于Controller的新类My_Controller,如果前缀不想使用MY的话可以在application/config/config.php 中的$config['subclass_prefix']变量来设置。

之后开始封装方法:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/** *Am_Controller **/
class My_Controller extends CI_Controller{    
    protected $layout = '';    
    protected $layoutData = '';

    public function __construct(){        
        parent::__construct();        
        $this->load->helper('url_helper');        
        $this->load->library('session');        
        $this->load->model('AdminModel');
    }
    /*
    *  request
    */
    public function request(){    
        $array = $_REQUEST;    
        foreach($array as $key=>$str){        
            $str = trim($str);        
            $str = str_replace("select","",$str);        
            $str = str_replace("update","",$str);        
            $str = str_replace("delect","",$str);        
            $str = str_replace("drop","",$str);       
            $str = str_replace("SELECT","",$str);        
            $str = str_replace("UPDATE","",$str);        
            $str = str_replace("DELETE","",$str);        
            $resquest[$key]=$str;    
        }    
        return $resquest;
    }

    /* 
    * 模板加载方法 
    * $file    文件路径 
    * $viewData    参数 
    * $layoutData  模板参数 
    */
    protected function render($file = NULL, &$viewData = array(), $layoutData = array()){   
         //查找token表,显示菜单    
        if( !is_null($file) ) {        
            $data['content'] = $this->load->view($file, $viewData, TRUE);        
            $data['layout'] = $layoutData;        
            $this->load->view($this->layout, $data);    
        } else {        
            $this->load->view($this->layout, $viewData);    
        }    
        $viewData = array();
    }

}
?>

以上的代码都是现成的,在网上就有,详细看<a href="http://www.tuicool.com/articles/nyYz2i">CI框架设置Layout布局</a>里面对这一实现说的比较详细,并且增加了一些拓展。

接下来算是原创了,属于懒癌晚期的我一直对CI的Model层抱有强烈不满,每每都要把需要的数据方法都在新建的Model类中写好,然后再去Controller中获取,麻烦到不能再麻烦了,那么是不是可以模仿Controller继承的写法来写一些简单实用的数据库方法呢?

答案是肯定的,既然想要就去模仿去实现
首先要在需求入手,sql无非就是增删改查,对这些方法进行封装就可以了,再加上在工作中总结的一些sql方法的使用效果,进行了一些模仿,有下:

首先是直接跑sql:
这个是一定要有的,在自己的方法不能满足需求的时候使用这个最为迅速,大概思路是这样的:

首先,在application/models中创建固定库,我的叫AdminModel.php
创建类并设置

<?php
class AdminModel extends CI_Model {

    public function __construct(){

        $this->load->database();
    }
}

接下来写一个传入sql语句就能够返回查询数据的方法

public function dusql($sql){
  
    $query = $this->db->query($sql);    

    return $query->result_array();
}

Model模块已经ok了,很easy
接下来是Controller,直接在之前设置好的My_Controller中添加方法

protected function mysql($sql){   
 
     $array = $this->AdminModel->dusql($sql);   

     return $array;
}

执行sql语句的方法已经结束了,接下来去自定义中的Controller中试一下吧

public function index(){
    
    $sql = "SELECT * FROM db_name";

    $result = $this->mysql($sql);

    echo json_encode($result);
}

似乎并没有想象的难,那么继续构思,实现其它数据库需求

定义完整的数据库Model

<?php
class Users extends CI_Model {
    protected $db_name = "users";    
    public function __construct()\{
        $this->load->database();
    }
    /*
     * 修改函数
     */
    public function updateAll($data,$where){
        foreach($where as $key=>$value){
            $this->db->where($key,$value);
        }
        $this->db->update($this->db_name,$data);
    }
    /*
     * 添加函数 
    */
    public function save($data){
        $this->db->insert($this->db_name,$data);
    }
}

以上代码对应数据库中的user表
创建Model时仅需要改变Class name$db_name就可以了



接下来对应的My_Controller

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 *Am_Controller 
**/
class Am_Controller extends CI_Controller{
    protected $layout = '';
    protected $layoutData = '';
    public function __construct(){
        parent::__construct();
        $this->load->helper('url_helper');
        $this->load->library('session');
        $this->load->model('AdminModel');
    }
    public function request(){
        $array = $_REQUEST;
        foreach($array as $key=>$str){
            $str = trim($str);
            $str = str_replace("select","",$str);
            $str = str_replace("update","",$str);
            $str = str_replace("delect","",$str);
            $str = str_replace("drop","",$str);
            $str = str_replace("SELECT","",$str);
            $str = str_replace("UPDATE","",$str);
            $str = str_replace("DELETE","",$str);
            $resquest[$key]=$str;
        }
        return $resquest;
    }
    /*
     * 模板加载方法
     * $file    文件路径
     * $viewData    参数
     * $layoutData  模板参数
     */
    protected function render($file = NULL, &$viewData = array(), $layoutData = array()){
        //查找token表,显示菜单
        if( !is_null($file) ) {
            $data['content'] = $this->load->view($file, $viewData, TRUE);
            $data['layout'] = $layoutData;
            $this->load->view($this->layout, $data);
        } else {
            $this->load->view($this->layout, $viewData);
        }
        $viewData = array();
    }
    /*
     * 模板输出
     * 不调用view层,直接输出
     */
    protected function printed($str){
        $data['content'] = $str;
        $this->load->view($this->layout,$data);
    }
    /*
     *  sql执行方法
     */
    protected function mysql($sql){
        $array = $this->AdminModel->dusql($sql);
        return $array;
    }
    /*
     * 为sql加上前缀
     */
    protected function perfix($str){
        return "db_".$str;
    }
    /*
     * 数据库加载类
     */
    protected function loadModel($model_name = NULL){
        $this->load->model($model_name);
    }
}
?>

基本设置完成,排版也是很累



接下来就是使用了
以上定义了一些功能性方法
在自己创建的Controller中进行使用
使用前要记得自己的Controller继承的是My_Controller而不是原生Controller

之前的不做表述,对后面写的方法做一些说明,如下:

class Admin extends My_Controller {

    public function index(){

    //sql
    $sql = "SELECT * FROM " . $this->prefix("user");
    $result = $this->mysql($sql);

    /*
    *以下方法需要先加载数据库
    *例如加载users表
    *增加方法
    */
    $this->loadModel("Users");  //注意这里的参数指的是创建的Model名
    unset($data);
    $data['id'] = 1;
    $data['name'] = "王二";
    $data['email'] = "12345@qq.com";
    $this->Users->save($data);

    /*
    *修改方法
    */
    $this->loadModel("Users");
    unser($data);
    $data['name'] = "王三";
    $data['email'] = "123456@qq.com";
    $this->Users->updateAll($data,array('id'=>1));  //第二个参数可以设置多个
    }
}

至于为什么没写删除方法,可以设置一个状态字段,某一特定值为删除状态,另一特定值为未删除状态就OK,这也是新get到的知识,要比对数据做删除好很多,还可以进行数据恢复等等

经过以上步骤用起来就方便多了,几个方法就可以搞定数据库的复杂操作,有没有很爽

虽说框架容易使用,但为了更好地使用并且能够解决随时可能出现的Bug,还是需要对使用的框架提升一个认知而并不应该简单的使用它。

本人也是CI的初学者,平时自己玩,希望有兴趣爱好的朋友多交流

如果你有更好的拓展或更深层的理解,如果乐意分享的话,请联系我:

maka_dvlp@163.com

上一篇下一篇

猜你喜欢

热点阅读