基于MVC的轻量级PHP框架
【CI目录框架】
License.txt许可协议 、user_guide用户手册 、 system框架核心文件、 application应用目录、 index.php 入口文件
【MVC】
- 入口文件:唯一一个让浏览器直接请求的脚本
- 控制器controller:协调模型和视图
- 视图view:只负责显示
- 动作action:是控制器中的方法,用于被浏览器请求。
【CI的MVC】
访问URL使用的是pathinfo形式 入口文件.php/控制器/动作
Application目录:
Controller控制器
Models 模型
View 视图
默认控制器是welcome
默认动作是action
【CI中的控制器】
命名风格:尽量使用全小写 例如user.php
不需要添加后缀
所有的控制器需要直接或者间接继承CI_Controller类
只有public的方法才能作为动作,且动作的方法不能一下划线进行开头
与类名相同的方法,会被PHP当做构造方法,相当于__controller()
【CI中加载视图】
1)在控制器中加载视图$this->load->view(“视图”);直接写视图名,不写扩展名,如果有子目录,则写上目录名
2)视图中直接使用PHP原生代码,不用模板
3)视图分配变量$this->load->vars(‘dom类型’,’内容’);或者将关联数组$adta=[]; 直接传入参数$this->load->vars($data);可以多次调用
4)推荐使用:
<?php foreach($list as $var):?>
<?=$var[‘name’]?>
<?php endforeach;?>
【CI超级对象】
CI的超级对象即当前的控制器对象。提供了很多属性:
(1)$this->load装载器类的实例 /system/core/Loader.php
1)CI会自动实例化一个CI_Loader对象,放在超级对象的属性中。类似于$obj=new CI__Loader();$this->load=$obj;但实际并不是这样子的。
2)装载器类提供的方法:view()装载视图、vars()分配变量到视图、database()装载数据库操作对象、model()装载模型操作对象、helper()装载帮助函数
(2) $this->uri是CI_URI类的实例/system/core/URI.php
CI_URI提供的方法:segment(n)用于获取URL中第n段的值。此时的URL:入口文件.php/控制器/动作/值1/值2.而传统的URL为:入口文件.php/控制器/动作/参数1/值1/参数2/值2..。。。get方式的传值用segment进行获取$this->segment(3);//值1 $this->segment(4);//值2
(3)$this->input输入类CI_Input的实例system/core/Input.php
提供的方法:$this->input->post(“user_name”);//$_POST[“username”];
$this->input->server(“DOCUMENT_ROOT”);//$_SERVER[“DOCUMENT_ROOT”];
在视图中直接用$this访问超级对象即可。
【CI访问数据库】
数据库操作:
- 修改配置文件,application/config/database.php配置需要的参数
- 装载数据库操作类$this->load->database();
- 装载数据成功后,会放入超级对象的属性中,默认属性名是db
- $res=$thus->db->query();执行MySQL语句,返回的是一个对象
- $res->result();得到数据结果,返回的是数组,里面是一个一个的对象。$res->result_asrray();返回二维数组,里面是关联数组。$res->row();返回第一条数据,直接是一个对象。
参数绑定:
$sql=”select * from blog_user where name=?”;
$this->db->query($sql,$name);//如果有多个问号,需要传入一个索引数组
表前缀:
修改配置文件中:$db[“default”][“swap_pre”]=”blog_”;
$db[“default”][“dbprefix”]=”blog_”;配置为一样的,代码中只要直接硬编码表前缀就行了,如果以后项目中表前缀发生变化,只需要修改$db[“default”][“dbprefix”]=”new_”;代码中的blog会自动替换为new_
Db的自动加载application/config/autoload.php 中
$autoload[“library”]=array(“database”);就不需要$this->load->database();
【AR模型Active Record】
查询:
- application/config/database.php中进行配置$active_record=TRUE;
- 在配置文件中配置表前缀后,会自动添加$res=$this->db->get(“表名”);//返回结果对象,然后进行$res->result();
插入:$bool=$this->db->insert(“表名”,关联数组);
更新:$bool=$this->db->updata(“表名”,关联数组,条件);
删除:$bool=$this->db->delete(“表名”,条件);
【连贯操作】
Select id,name from tablename where id=3 order by id desc limit 2,3;
$res=$this->db->select(‘id,name’)
->from(‘user’)
->where(‘id >=’,3)
->limit(3,2)//跳过两条取三条数据
->order_by(“id desc”)
->get()
显示最近的一条SQL:$this->db->last_query();
Where :
$res=$this->db->where(‘name’,’mary’)->get(‘user’);
$res=$this->db->where(‘name !=’,’mary’)->get(‘user’);
$res=$this->db->where(array(‘name’=>’mary’))->get(‘user’);
$res=$this->db->where(array(‘name’=>’mary’,’id’=>’2’))->get(‘user’);
复杂的查询,调用$this->db->query($sql,$data);使用问号绑定参数
【扩展CI的控制器】
在核心文件夹system中找到文件所在的位置,在application中找到application/core/文件夹位置新建MY_Controller.php,类继承CI_Controller类。为什么是MY_controller呢,因为配置文件config.php文件中$config[‘subclass_prefix’]=”MY_”;
【模型】
继承自CI_Model在模型中,可以直接使用超级对象的属性。
文件名,全小写
类名首字母大写建议使用_model作为后缀,防止和控制器类名冲突。
【URL相关函数】
使用之前需要先进行加载helper,可以在autoload.php中配置
$autoload[‘helper’]=array(’url’);也可以在需要的时候自己进行手动加载
$this->load->helper(‘url’);
Site_url(‘控制器/方法’)
Base_url();
【设置路由】
配置文件在application/config/routes.php中$route[‘default_controller’]=’welcome’;
改变路由: 先进行路由匹配,然后修改成相应地路由文件
//http://locahost/ci/index.php/news/2019/3.html
$route[‘news/[\d]{6}/([\d]+)\/html’]=article/show/$1;
-
- 隐藏入口文件:开启Apache http.conf的rewrite模块:localmodule rewrite_module module/mod_rewrite.so重启Apache。在入口文件同级目录中,放入一个.htaccess文件。将未匹配成功的文件全都重写到默认文件中去。
【分页】
//加载对应的library和helper配置
$this->load->library(‘pagination’);
$this->load->helper(‘url’);
//设置需要显示的关联数组
$page_size=10;
$config[‘base_url’]=site_url(‘user/test’);
$config[‘total_rows’]=100;
$config[‘per_page’]=$page_size;
$config[‘first_link’]=’首页’;
$config[‘next_link’]=’下一页’;
$congfig[‘uri_segment’]=3;//分页的数据查询偏移量在哪一段上
//调用分页对象及方法
$this->pagination->initialize($config);
$offset=intval($this->segment(3));//与config[‘uri_segment’]对应
展示view
$sql=’’;
$data[‘links’]=$this->pagination->create_links();
$this->load->view(‘user/test’,$data);
【文件上传】
//上传目录需要手工创建
$config[‘upload_path’]=’./uploads/’;
//允许上传的内容
$config[‘allow_types’]=’gif|png|jpg|jpeg’;
$config[‘max_size’]=’10000’;
//生成新的文件名
$config[‘file_name’]=uniqid();
//装载文件上传
$this->load->library(‘upload’,$config);
$this->upload->do_upload(‘pic’);
//获取上传之后的数据
$data=$this->upload->data();
【session】
设置:
$this->session->set_userdata(‘user’,$data);
不在设置session的时候获取存入的数据,只有页面重新加载或者跳转到别的URL的时候才能重=重新获取得到。
一次性的数据只能获取一次
$this->session->set_flashdata(‘test’,’aaaa’);
获取:
$this->load->library(‘session’);
$data=$this->session->userdata(‘user’);或者$this->session->flashdata(‘data’);
【验证码】
//需要加载helper,并且手动创建验证码的存放路径
$this->load->helper(‘url’);
$this->load->helper(‘captcha’);
$vars=[‘img_path’=>’./captcha/’, //此目录需要手动创建
‘img’=>base_url().’/captcha/’];
$cap=create_captcha($vars);
// 推荐直接把验证码放入到session中,然后拿到数据之后用session中的数据进行对比即可。Session_start();$_SESSION[‘cap’]=$cap[‘word’];
【表单验证】
$this->load->library(‘form_validation’);
$this->form_validation->set_rules(‘name’,’用户名’,’require’);
$this->form_validation->set_rules(‘email,’邮箱’,’vaild_email’);
$bool=$this->form_caildation->run();
If($bool){验证成功}else{显示错误信息}