ThinkPHP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP相关的知识,希望对你有一定的参考价值。
Thinkphp
- 在实际工作中如果不使用框架会遇到什么问题?
- 程序项目生命时间非常短(维护性、生命力弱)
- 大家分工协作开发项目,彼此代码风格不一致
- 大家在开发程序时候,喜欢挖陷阱,让公司重视
- 突然有一天有人离职,其他人需要把这个人开发的程序给接起来
- 牵一发动全身
- 到底什么是框架
MVC是一个设计模式,80年代
主流框架设计模式都是MVC
在php中,框架是一堆代码的集合,这些代码里边有变量、常量、方法、函数、类。
这些代码里边也有设计模式,例如:MVC、单例、AR、工厂。
?
框架最大的特点的使得程序的业务逻辑与数据模型有分开。
?
- 相关框架:
ThinkPHP:国人开发的一个轻量级框架、注释都是中文的。国人使用非常广泛。
????????????????面向过程、面向对象
zendframework:zend公司官方框架,重量级的,功能非常丰富
Yii:xueqiang,qiang,重量级,OOP面向对象。功能丰富,外国人使用最多的框架。
cakephp:外国框架,功能较丰富。重量级,速度慢
symfony:外国重量级框架,功能丰富。
CodeIgniter:轻量级框架,开发速度快
?
重量级:功能多、OOP面向对象、维护性好、生命力非常顽强
轻量级:功能实用,面向过程和面向对象混合
?
【使用tp框架】
http://www.thinkphp.cn
- 创建应用
- 创建入口文件index.php
- 在入口文件引入tp框架核心程序ThinkPHP.php
?
- 应用创建完毕发生了什么
?
2. 处于安全考虑,入口文件位置设置:
新的入口文件内容:
?
?
2013-12-20 昨天内容回顾
- 创建tp应用
- 创建入口程序文件go/index.php
- 引入框架核心程序文件 ThinkPHP/ThinkPHP.php
- 把当前模式设置为开发调试模式 define("APP_DEBUG",true);
- 设置当前应用的路径(自动创建的目录的地方) define("APP_PATH","../");
- 控制器和模板创建、整合
- UserAction.class.php (shop/lib/Action/UserAction.class.php)
- Tpl/[分组名/]控制器标志/具体模板名称.html
- 模板与框架进行整合
- css和img图片(在入口文件设置路径常量)
- css样式文件本身在引入img图片的时候,图片路径相对css文件本身走
- css和img图片需要被单独可以访问到,因此需要放入go目录下边
- 空操作 和 空模块处理
- 空操作:
- 在具体模块里边定义一个_empty()方法处理
- 定义一个函数__hack_action()
- 如果有对应的模板,也会显示
- 空模块
- 定义一个控制器名字为EmptyAction.class.php
- 定义一个函数__hack_module()
- 项目分组
- 在配置文件config.php设置两个项目(分组列表、当前默认分组)
- 控制器、模板、配置文件、cssimg分组、函数文件common
- 跨模块调用
- A("[项目://][分组/]模块") 实例化控制器对象
- R("[项目://][分组/]模块/操作‘) 实例化控制器对象并调用相关操作方法
- U("[分组/]模块/操作") 创建请求路由
?
?
【数据库操作】
?
- 数据库相关参数配置
2. MVC Model
????model也是一个操作类
????数据库中每个数据表都对应一个数据model模型类
- 创建数据模型
- 使用数据模型
入口文件制作调试函数,方便使用
?
- 字段缓存效果
- model模型属性使用
- config.php数据表字段缓存情况分析:
?
【实例化数据模型model】
- $goods_model = new GoodsModel();
- $goods_model = D("Goods"); 快捷函数
- $obj = D(); //创建了一个基类model的对象,没有指明具体操作的数据表
- 通过这个$obj就可以执行原生的sql语句
- $model = M(); 创建基类model对象
- $model = M(‘User‘); 创建基类model对象,但是操作的数据表sw_user
?
【查询数据信息】
关键字:select()
?
- 把模板引擎切换为smarty
- 在配置文件config.php里边切换模板引擎
tp的配置变量信息有两部分:
convertion.php
ThinkPHP/Lib/Behavior.*行为里边有一部分
- 在模板里边展示具体商品信息
?
- 在页面底部显示系统运行的日志信息(必须调用display()才会显示日志信息)
- 查询方法select具体使用
【查询相关操作方法】
1. sql语句最后都通过options属性进行拼装:
Db.class.php的代码
2. 模型相关方法分析
????① Model.class.php类本身就存在该方法,例如(where() field() limit() select())
????② __call()自动调用方法集成了一些方法,例如(table() order() group())
????这些方法可以进行连贯操作$info = $obj -> where()->order()->limit()->select()
- 相关方法具体使用
?
总结:
- 在config.php配置文件做数据库连接
- 创建数据模型GoodsModel.class.php
- 实例化模型对象(new GoodsModel() D("Goods") M())
- 数据查询
- select() 二维数组数据
- find() 一维数组数据
- 相关连贯操作方法where order limit field group
- smarty模板引擎
?
【getBy查询数据信息】
- select() 返回二维数组
- find() 返回一维数组
- getByXXX(); 根据指定字段进行数据查询
返回一维数组
getByGoods_price(12000);
getByGoods_name(); 魔术__call();
?
????order() group() 在__call() 自动调用魔术方法有集成好。
????
?
- having() 设置查询条件
与where比较类似
select * from sw_goods where goods_price>100;
select * from sw_goods having goods_price >100;
?
【model聚合函数使用】
count() sum() max() avg() min()
?
【执行原生sql语句】
$model -> query() 查询语句 (二维数组返回)
$model -> execute() 增加、修改、删除
???????????????? insert update delete
????????????????????成功执行返回受影响的记录数目
?
【添加数据add】
两种方式实现数据添加:数组方式、AR方式
- 数组添加数组
- AR(Active record 活跃记录)方式添加数据
AR规则:
- 数据库中的每个数据表都对应一个类,model
- 数据表中的每条记录都是类的一个对象
- 记录信息的每个字段都是对象的属性
在tp框架中AR模型是假的
- 数据查询有options属性汇集各种连贯查询条件
数据添加有data属性实现各种信息的收集
【通过表单form实现数据添加】
【修改数据】
查询:select() 添加:add()
修改关键字:save() 返回受影响的记录数目
?
添加数据:数组 和 AR
修改数据:数组 和 AR
注意:实现数据修改必须符合两个条件(主键id 或 where条件)
????
具体使用:
????????
【具体案例数据修改实现】
http://网址/index.php?m=控制器&a=操作&goods_id=100&goods_price=2300
http://网址/index.php/控制器/操作/参数1/值/参数2/值/参数3/值。。。。。。
function upd(参数1,参数2,参数3){
????//$_GET[‘参数1‘];
????//$_GET[‘参数2‘];
????参数1,参数2,参数3具体使用
}
?
1. $this -> success()方法被调用后出错:
解决:
① 在config.php里边做配置(把对应的模板文件复制到admin目录下边)
② 修改文件ThinkPHP/Lib/Core/View.class.php
????????????
????
????2. 商品修改
????????① 在修改按钮处,通过get方式把被修改的商品id传递给下个页面
????????????????
????????② 在修改表单里边制作隐藏域保存商品id信息,
这样实现商品修改就有主键的条件
?
【tp框架中表单域验证】
用户注册
表单验证:
????通过tp框架进行表单验证
????先决条件:收集表单数据必须通过create()收集
????create()方法内部有集成表单验证规则
????
?
????验证规则的第四个参数:
????
????具体使用:
????
总结:
1. 原生sql语句(query() execute())
- 实现数据添加add()
- 利用form表单实现数据添加
- 收集表单数据利用create()方法
- 数据修改save()
- 条件:主键值条件、where条件
3. 删除方法
????$z = $model -> delete(10);
- 表单验证
- $_validate
- 先决条件是通过create()收集表单数据
?
?
作业:
- 在商城后天实现商品的 增、列表显示、修改、删除操作(熟练操作)
- 练习表单验证
?
2013-12-22 昨天内容回顾
- 实例化模型对象三种方式
- $user_model = new UserModel();
- $user_model = D("User");
- $model = D(); //Model基类
c) $model = M(); //Model基类
????$user_model = M("User"); //实例化Model基类,操作user数据表
- 查询select数据库
- select(主键参数) //反二维数组数据
- find(主键参数) //返回一个数组数据
- getByXXX() //根据某个字段作为条件查询信息 getByUsername(‘tom‘)
- 相关连贯操作
- where() -> order() -> having()->group() -> distinct()->limit()
- 以上方法调用完毕会把当前模型对象返回return this,因此许多方法可以连贯操作执行
- 最后执行方法select()查询
- $user_model -> where("id=100")->delete();
- $user_model -> where("id>150")->save(数组参数); 修改动作
- 聚合函数
- sum(字段) count(*/字段) max(字段) min(字段) avg(字段)
- $goods_model -> where("price>500") -> sum(‘price‘);
- $goods_model -> where("id>100")->count();
- 执行原生sql语句
- $model -> query(sql语句) 查询语句
- $model -> execute(sql语句) 增、删、改语句执行,返回受影响的记录条数
- 添加数据insert
- add()方法
- 数组、AR方式
- 修改update商品信息
- save()方法
- 数组、AR方式
- 注意:设置where条件 或者 主键条件(避免修改全部的记录)
- 删除数据
- $model > delete(主键)
- 收集表单数据
- create()方法收集数据
- 表单验证
通过create方法接收表单数据,才可以触发验证
$_validate = array(具体表单域验证,具体表单域验证,具体表单域验证);
【完整版介绍】
?
【smarty使用】
- smarty如何引入进来的
- 在config.php里边修改smarty的参数信息
????
- smarty布局继承效果
布局继承 extends block
????利用布局继承提取头部、脚部对系统维护升级有很大的好处(减少重复性劳动)
????
- 模板包含
????
????用户中心左边有共同的内容,为了维护方便,有两种方案处理
- 可以把内容提取出来,其他模板页面include包含引入
- 可以制作第二个布局页面(头部、脚部、左边内容),用户中心单独引入该布局
?
- 用户中心访问不同的页面,对应标签需要高亮显示
通过路由解析,判断出当前的具体操作,就可以知道哪个标签高亮显示
如何知道具体操作方法是什么?
dispatch解析路由
根据当前请求方法,判断出具体标签高亮显示。
?
- display()显示具体模板
$smarty -> display(模板名称);
ThinkPHP框架调用模板:
????① $this -> display(); tp框架会自动把摸板名称给拼装好,与操作名一致
????② $this -> display(模板名); 调用当前模块下的指定模板,模板没有后缀名
????③ $this -> display(模块/模板名); 调用其他模块下额指定模板
????④ $this -> display(相对路径模板); 了解
????
?
【引入机制import】
include() require
通过import引入对应的类文件
import("hello.world.apple"); hello/world/apple.class.php
- 都可以引入什么地方的类文件
- 本项目的类文件可以引入 import("@.dir.dir.file");
- 对应的类文件都需要创建在shop/Lib/XXX目录下边
- ThinkPHP核心类文件可以引入 import("think.dir.dir.file")
- 对应类文件都设置在ThinkPHP/Lib/XXX
- ThinkPHP/Extend 扩展库类文件可以引入 import("ORG.dir.dir.file");
- 对应的类文件在ThinkPHP/Extend/Library/ORG/XXX
- 特殊类引入,#号使用
总结:
- smarty
- 布局使用 extends file="public/layout.html" block
- 模板包含include
- display() 四种方式
- 引入机制 import方法
- 验证码
?
- 用户登录
- 数据分页
- 缓存
- 多语言设置
- 自动完成、自动映射
- 面向切面编程理解
【用户登录系统】
?
- 显示验证码
- 判断验证码
- 判断用户名和密码是否正确
模型对应方法checkNamePwd()
- session操作
cookie与session操作样子一致
?
5. 退出系统逻辑
【数据分页】
- 自定义分页类在框架中的使用
- 具体使用分页类
?
【缓存使用】
缓存:把数据库中的信息获取出来,放到一个缓冲介质里边,在相当一段时间之内,重复的数据就去缓存里边读取。
?
缓存介质:内存、file文件、数据库
?
不同的缓存介质,操作的方式不一样
1. 具体使用:
- 缓存案例
【多语言设置】
- 进行多语言配置config.php
- 配置行为Behavior执行
- 具体语言文件设置:
4.具体语言使用????
????
????$language是在控制器通过L()函数传递的变量
????
????通过L()函数读取语言信息,传递给控制器
?
【自动完成】
收集表单信息,把数据存入数据库
可以使用"自动完成"机制对即将入库的信息进行二次处理
例如:密码加密、用户注册时间等等。
?
自动完成 类似 表单验证
表单验证在create()方法内部触发
自动完成 也在create()方法内部触发
?
【自动映射】
?
自动映射和自动完成都通过create()方法触发。
?
【面向切面编程】
程序开发、执行不同的环节、不同的功能利用不同的文件进行处理。
把一个大块的功能切割为小块进行开发、执行
?
tag("app_begin");
????function tag()
????????配置tags变量信息
????????B()
????function B()
????????实例化行为Behavior,调用run()方法
tags.php
?
总结:
- 通过用户登录使用验证码
- 数据分页
- 缓存使用S()
- 多语言设置
- 自动完成、自动映射
- 面向切面编程Behavior分析
tag()函数
????
作业:
- 用户登录(后台,用户信息存入session,前台登录)
- 分页效果(后台、前台)
- smarty布局和include模板包含练习
rbac:role base access (基于角色的用户权限控制)
ThinkPHP
?
RBAC (role base access) 基于角色的权限控制
?
?
经理角色:"Company-show,Cat-mag,Product-list"
3张数据表
?
- 模拟数据
权限数据
????角色数据
????
????管理员数据
????
?
- 查询用户拥有的具体权限IndexAction-----left
- 控制器用户访问具体的模块和操作方法
给普通控制器找一个父类,这个父类再继承Action
?
- 已有权限判断
- 给角色分配权限、表单、数据接收处理
?
总结:
- 数据模拟权限控制
- 利用模拟数据进行权限控制
- 左边菜单按钮进行控制IndexAction.class.php left
- 具体模块---操作权限控制 AdminAction.class.php
- 为角色进行具体权限分配(控制、view视图模板、model接收处理数据distributeAuth()方法)
?
manager 管理员
role 角色表
auth 权限
?
【具体权限管理】
添加权限:
?
【系统管理员设置】
?
开发步骤:
- 设置虚拟数据
- 通过虚拟数据设置权限
- 左边具体权限列表显示控制器(admin用户不限制)
- 在父类控制器AdminAction中对每个权限进行过滤控制(admin用户不限制)
- 通过"角色"分配具体权限 role
- 权限管理设置(分级显示权限-/)
- 三级权限设置管理
- 对管理员的角色设置
?
?
?
?