CI 框架简单入门笔记

2017-01-13 10:50:57来源:segmentfault作者:牙小木木人点击

1.mvc一般思路

C层: 入口文件-URL获取控制器$_GET['c']和方法$_GET['a']--包含c的文件类(控制器文件)- 实例化c控制器对象-调用方法a(并协调模型和视图),C层不直接调用DB,下面会有提到。


V层: 在C层中include views下对应的文件即可展现C中变量,require ./views/xxView.html


M层:通过连接DB获取所有的数据,return 给C层,这时候需要在C层require ./models/xxModel.php,最后在C中通过view 让数据显示出来。注意M只提供数据,做数据复用


注意action 是控制器中的方法,用于被浏览器直接请求


目录结构


index.php


Model


UserModel.class.php

View


index.html

Controller


UserController.class.php2.CI中的pathinfo访问模式

入口文件/控制器/方法


其中action中为protected functon 和private 不能被浏览器请求,注意Controller文件名需要小写。方法中action (public functions)不能用_开始。


方法名不区分大小写。


CI中都extends CI_CONTROLLER,注意前缀都为CI


注意不要建立Index控制器的index方法,类名相同的会当作构造方法。因为CI的控制器没有后缀,所以类名会和方法名一样,导致构造函数加载。


3.CI中的视图

视图文件可以用下划线区分,例如user_区分,但一般都建立单独的文件夹,可以直接load视图,不用写扩展名。


$this->load->view('user/index');
$this->load->view('user_index');

注意视图中可以直接写php源码。


CI中如果没用smarty ,如果需要加载变量可以用


$this->load->var('title','this is title');

如果是二维数组,


$data[]=1;
$data[]=2;
$this->load->var($data);

可以多次load view,以加载不同的view公共部分。


推荐使用


<?php foreach ($list as $item):?>
<?=$item['id']?>
<?=$item['name']?>
<?php endforeach;?>4.CI的超级对象-LOAD

$this->load ===


$obj=new CI_LOADER();
$this->load=$obj;
$this->load->view();

注意但ci并不是做的自动加载,并不是以上面那种方式运行的。当时有面试官还问过,我以为所有的框架都是spl_autoload_register,真是汗颜..


load的属性有view var database model helper 等


5.CI的超级对象-CI_URI类

分段获取
segment 从入口文件.php后,分断获取
$this->uri->segment(4)是按照index.php/后面开始的第一个段开始。


之前的:入口文件.php/控制器/动作/参数1/值1/参数2/值2
CI中: 入口文件.php/控制器/动作/值1/值2


$this->segment(3);//值1
$this->segment(4);//值2


可以在方法的参数中传递参数,ci会按照顺序获取值


index.php/控制器/index/6/12


public function index($p=0,$age){
echo $p,$age;//6,12
}6.CI的超级对象 input对象

CI_INPUT类


$this->input->post('username');注意get的参数 用uri分段获取..$this->input->server('DOCUMENT_ROOT')

视图里也可以通过$this访问超级对象,因为就是include进来的


7.CI中的数据库操作

数据库访问SQL


先配置config/database.php


装载数据库操作类,可以加载多个数据库


$this->load->databases();
//var_dump($this->db);
$res=$this->db->query("select * from user");// return object
$user_list=$res->result();
//注意返回的返回数组下的某(多)个对象,对应mysql_fetch_object$data['user_list']=$user_list
$this->load->view('user/list/',$data)//view 层用 user_list展现$res->result_array();返回关联数组
$res->row();返回第一条数据,也是个对象
$res->row_array();返回第一条数据,数组

更多官方参考


插入数据


$this->load->database();//可以在auto中自动加载db类$sql="insert into user ('name','pwd') values('tom','md5(123)')";$this->db->query();//MYSQL_QUERY() [return RES or BOOL]

MYSQL_AFFECT_ROWS 对应CI中的$this->db->affect_rows();
MYSQL_INSERT_ID 对应CI 中的 $this->db->insert_id();


用此db处理方法,第一需要自己写表前缀,第二需要自己处理安全措施。


表前缀可以借助配置文件读取 常量,CI中有**SWAP_PRE**,交换的前缀来处理表前缀。万一数据库表前缀修改,只需要修改DBPREFIX就行了。


安全措施可以借助 $this->input->post('name');


$data[0]='tom';
$data[1]='123';

参数绑定插入


$sql="insert into user ('name','pwd') values('?','?')";

将data拼装为数组,作为$this->db->query($sql,$data);


参数绑定查询


$sql="select * from user where username=?";
$this->query($sql,$username);8.CI中的AR模型

是CI中访问数据库的第二种方式,第一种就是上面的load->database();增删改差 都是query。需要写大量sql语句


配置文件autoload 自动加载database


$auto_load['librarys']=array('database');CI_DB_ATCIVE_record extends ci_db_driver

config/database中的active_record需要打开,这样才会继承ACTIVE


$res=$this->db->get('user');//user 表名,会自动加表前缀var_dump($res->result);

插入:


$data=['name'=>'tom','pwd'=>'md5(123)'];
$this->db->insert('user',$data);//表名+关联数组=》return bool

修改:


$data=['email'=>tom@126.com,'pwd'=>'md5(1234)'];
$this->db->update('user',$data,array('id'=>3));// 表名,数据,where 条件。=?return bool

删除


$this->db->delete('user',array(id=>3));

AR中连贯操作


$this->db
->select('id,name')//字段名
->where ('id'>=3)//需要有空格
->limit(3,2)//跳过2条,取三条
->order_by('id desc');
->get();

调试sql语句输出最后一条sql ,可以结合log函数输出到指定日志文件


$this->db->last_query();$res=$this->db->where('name','tom')->get('USER');//SELECT * FROM USER WHERE NAME=TOM;

具体可点击这里查看更多连贯操作


如果太复杂的,那就写SQL吧,记得用?绑定参数,过滤接受参数等


自增id


$this->db->insert_id();

受影响行


$this->db->affect_rows();9.对CI控制器扩展

APPLICATION和SYSTEM文件夹中相同的部分 ,只需要在application中对应的Core中写MY_扩展。
比如在application/core/MY_Controller.php


class MY_Controller extends CI_Controller{public function __construct(){
parent::construct();
//登录验证}
}

可以修改类前缀 在
config/config.php/$config['subclass_prefix']中,默认为MY_


10.CI中的模型Model

一些注意事项:文件需要全小写,但是类名要大写,并且需要用User_model,为了和控制器保持区分不冲突。


在模型MODEL中可以用所有超级对象的属性,可以具体查看system/core/CI_MODEL.php 文件


不要在控制器直接调用$this->db->get()文章头提到【虽然可以实现相同功能,但是很不规范】应该放在model中,控制器中只允许从user_model中load


user controoler中代码:在控制器中加载模型


$this->load->model('user_model');//第二个参数为别名,可选 $list=$this->user_model->getall();
$this->load->view('user/index',array('list'=>$list));

user_model代码:


class user_model extends ci_model{
public function getall(){
$res=$this->db->get('user');
return $res->result();
}
}11.url相关函数

需要手动加载:


$this->load->helper('url');

解决不同环境,不同路径的问题
site_url
base_url
类似与wordpress那些东西


可以自动加载


$autoload['helper']=array('url')12.路由配置

默认控制器 default_controller


通过路由规则,实现url与实际控制器相分离.实现url的高度定制


http://site.com/index.php/news/20170108/4.html
$route['news/[/d]{6}/([/d]+/.html)']='article/show/$1'

另外结合apache/nginx的rewrite 隐藏index.php


13.分页
$this->laod->library('pagination');

注意load url,然后用site_url,放入page的初始化函数中,用segment获取对应的intval(段),作为offset


CI中更多细节请点这里

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台