干货:php框架CodeIgniter工作前的准备
对于刚接触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的初学者,平时自己玩,希望有兴趣爱好的朋友多交流
如果你有更好的拓展或更深层的理解,如果乐意分享的话,请联系我: