ThinkPHP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP相关的知识,希望对你有一定的参考价值。

Thinkphp

  1. 在实际工作中如果不使用框架会遇到什么问题?
    1. 程序项目生命时间非常短(维护性、生命力弱)
    2. 大家分工协作开发项目,彼此代码风格不一致
    3. 大家在开发程序时候,喜欢挖陷阱,让公司重视
    4. 突然有一天有人离职,其他人需要把这个人开发的程序给接起来
    5. 牵一发动全身
  2. 到底什么是框架

    MVC是一个设计模式,80年代

    主流框架设计模式都是MVC

    在php中,框架是一堆代码的集合,这些代码里边有变量、常量、方法、函数、类。

    这些代码里边也有设计模式,例如:MVC、单例、AR、工厂。

    ?

    框架最大的特点的使得程序的业务逻辑与数据模型有分开。

    ?

  3. 相关框架:

    ThinkPHP:国人开发的一个轻量级框架、注释都是中文的。国人使用非常广泛。

    ????????????????面向过程、面向对象

    zendframework:zend公司官方框架,重量级的,功能非常丰富

    Yii:xueqiang,qiang,重量级,OOP面向对象。功能丰富,外国人使用最多的框架。

    cakephp:外国框架,功能较丰富。重量级,速度慢

    symfony:外国重量级框架,功能丰富。

    CodeIgniter:轻量级框架,开发速度快

    ?

    重量级:功能多、OOP面向对象、维护性好、生命力非常顽强

    轻量级:功能实用,面向过程和面向对象混合

    ?

【使用tp框架】

http://www.thinkphp.cn

技术分享

技术分享

技术分享技术分享

技术分享

  1. 创建应用
    1. 创建入口文件index.php
    2. 在入口文件引入tp框架核心程序ThinkPHP.php

    ?

    技术分享

  2. 应用创建完毕发生了什么

    技术分享

    技术分享

    ?

2. 处于安全考虑,入口文件位置设置:

技术分享

新的入口文件内容:

技术分享

?

?

2013-12-20 昨天内容回顾

  1. 创建tp应用
    1. 创建入口程序文件go/index.php
    2. 引入框架核心程序文件 ThinkPHP/ThinkPHP.php
    3. 把当前模式设置为开发调试模式 define("APP_DEBUG",true);
    4. 设置当前应用的路径(自动创建的目录的地方) define("APP_PATH","../");
  2. 控制器和模板创建、整合
    1. UserAction.class.php (shop/lib/Action/UserAction.class.php)
    2. Tpl/[分组名/]控制器标志/具体模板名称.html
    3. 模板与框架进行整合
    4. css和img图片(在入口文件设置路径常量)
    5. css样式文件本身在引入img图片的时候,图片路径相对css文件本身走
    6. css和img图片需要被单独可以访问到,因此需要放入go目录下边
  3. 空操作 和 空模块处理
    1. 空操作:
    2. 在具体模块里边定义一个_empty()方法处理
    3. 定义一个函数__hack_action()
    4. 如果有对应的模板,也会显示
    5. 空模块
    6. 定义一个控制器名字为EmptyAction.class.php
    7. 定义一个函数__hack_module()
  4. 项目分组
    1. 在配置文件config.php设置两个项目(分组列表、当前默认分组)
    2. 控制器、模板、配置文件、cssimg分组、函数文件common
  5. 跨模块调用
    1. A("[项目://][分组/]模块") 实例化控制器对象
    2. R("[项目://][分组/]模块/操作‘) 实例化控制器对象并调用相关操作方法
    3. U("[分组/]模块/操作") 创建请求路由

    ?

    ?

    【数据库操作】

    ?

    1. 数据库相关参数配置

      技术分享

    2. MVC Model

    ????model也是一个操作类

    ????数据库中每个数据表都对应一个数据model模型类

    1. 创建数据模型

      技术分享

    2. 使用数据模型

      入口文件制作调试函数,方便使用

      技术分享

      ?

    3. 字段缓存效果

      技术分享

    4. model模型属性使用

      技术分享

    5. config.php数据表字段缓存情况分析:

      技术分享

    ?

    【实例化数据模型model】

    1. $goods_model = new GoodsModel();
    2. $goods_model = D("Goods"); 快捷函数
      1. $obj = D(); //创建了一个基类model的对象,没有指明具体操作的数据表
      2. 通过这个$obj就可以执行原生的sql语句
    3. $model = M(); 创建基类model对象
      1. $model = M(‘User‘); 创建基类model对象,但是操作的数据表sw_user

    技术分享

    ?

    【查询数据信息】

    关键字:select()

    ?

    1. 把模板引擎切换为smarty

      技术分享

    2. 在配置文件config.php里边切换模板引擎

      tp的配置变量信息有两部分:

      convertion.php

      ThinkPHP/Lib/Behavior.*行为里边有一部分

    技术分享

    1. 在模板里边展示具体商品信息

      ?

    2. 在页面底部显示系统运行的日志信息(必须调用display()才会显示日志信息)

      技术分享

      技术分享技术分享

    3. 查询方法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()

    1. 相关方法具体使用

      技术分享

      技术分享

      ?

      总结:

      1. 在config.php配置文件做数据库连接
      2. 创建数据模型GoodsModel.class.php
      3. 实例化模型对象(new GoodsModel() D("Goods") M())
      4. 数据查询
        1. select() 二维数组数据
        2. find() 一维数组数据
        3. 相关连贯操作方法where order limit field group
      5. smarty模板引擎

    ?

    【getBy查询数据信息】

    1. select() 返回二维数组
    2. find() 返回一维数组
    3. getByXXX(); 根据指定字段进行数据查询

      返回一维数组

      getByGoods_price(12000);

      getByGoods_name(); 魔术__call();

    ?

    ????order() group() 在__call() 自动调用魔术方法有集成好。

    ????技术分享

    ?

    1. 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方式

    技术分享技术分享

    1. 数组添加数组

      技术分享

    2. AR(Active record 活跃记录)方式添加数据

      AR规则:

      1. 数据库中的每个数据表都对应一个,model
      2. 数据表中的每条记录都是类的一个对象
      3. 记录信息的每个字段都是对象的属性

      在tp框架中AR模型是假的

      技术分享

    3. 数据查询有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())

  6. 实现数据添加add()
    1. 利用form表单实现数据添加
    2. 收集表单数据利用create()方法
  7. 数据修改save()
    1. 条件:主键值条件、where条件

    3. 删除方法

    ????$z = $model -> delete(10);

  8. 表单验证
    1. $_validate
    2. 先决条件是通过create()收集表单数据

    ?

    ?

    作业:

    1. 在商城后天实现商品的 增、列表显示、修改、删除操作(熟练操作)
    2. 练习表单验证

    ?

    2013-12-22 昨天内容回顾

  9. 实例化模型对象三种方式
    1. $user_model = new UserModel();
    2. $user_model = D("User");
      1. $model = D(); //Model基类

    c) $model = M(); //Model基类

    ????$user_model = M("User"); //实例化Model基类,操作user数据表

  10. 查询select数据库
    1. select(主键参数) //反二维数组数据
    2. find(主键参数) //返回一个数组数据
    3. getByXXX() //根据某个字段作为条件查询信息 getByUsername(‘tom‘)
  11. 相关连贯操作
    1. where() -> order() -> having()->group() -> distinct()->limit()
    2. 以上方法调用完毕会把当前模型对象返回return this,因此许多方法可以连贯操作执行
    3. 最后执行方法select()查询
    4. $user_model -> where("id=100")->delete();
    5. $user_model -> where("id>150")->save(数组参数); 修改动作
  12. 聚合函数
    1. sum(字段) count(*/字段) max(字段) min(字段) avg(字段)
    2. $goods_model -> where("price>500") -> sum(‘price‘);
    3. $goods_model -> where("id>100")->count();
  13. 执行原生sql语句
    1. $model -> query(sql语句) 查询语句
    2. $model -> execute(sql语句) 增、删、改语句执行,返回受影响的记录条数
  14. 添加数据insert
    1. add()方法
    2. 数组、AR方式
  15. 修改update商品信息
    1. save()方法
    2. 数组、AR方式
    3. 注意:设置where条件 或者 主键条件(避免修改全部的记录)
  16. 删除数据
    1. $model > delete(主键)
  17. 收集表单数据
    1. create()方法收集数据
  18. 表单验证

    通过create方法接收表单数据,才可以触发验证

    $_validate = array(具体表单域验证,具体表单域验证,具体表单域验证);

    【完整版介绍】

    技术分享

    ?

    【smarty使用】

  19. smarty如何引入进来的

    技术分享

  20. 在config.php里边修改smarty的参数信息

    ????技术分享

  21. smarty布局继承效果

    布局继承 extends block

    技术分享技术分享

    ????利用布局继承提取头部、脚部对系统维护升级有很大的好处(减少重复性劳动)

    ????技术分享

  22. 模板包含

    技术分享

    ????技术分享

    ????用户中心左边有共同的内容,为了维护方便,有两种方案处理

    1. 可以把内容提取出来,其他模板页面include包含引入
    2. 可以制作第二个布局页面(头部、脚部、左边内容),用户中心单独引入该布局

    ?

  23. 用户中心访问不同的页面,对应标签需要高亮显示

    技术分享

    通过路由解析,判断出当前的具体操作,就可以知道哪个标签高亮显示

    http://网址/index.php/模块/操作方法

    如何知道具体操作方法是什么?

    dispatch解析路由

    技术分享

    技术分享

    根据当前请求方法,判断出具体标签高亮显示。

    ?

  24. 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

  25. 都可以引入什么地方的类文件
    1. 本项目的类文件可以引入 import("@.dir.dir.file");
      1. 对应的类文件都需要创建在shop/Lib/XXX目录下边
      2. 技术分享
    2. ThinkPHP核心类文件可以引入 import("think.dir.dir.file")
      1. 对应类文件都设置在ThinkPHP/Lib/XXX
      2. 技术分享
    3. ThinkPHP/Extend 扩展库类文件可以引入 import("ORG.dir.dir.file");
      1. 对应的类文件在ThinkPHP/Extend/Library/ORG/XXX
      2. 技术分享
    4. 特殊类引入,#号使用

      技术分享技术分享

    总结:

    1. smarty
      1. 布局使用 extends file="public/layout.html" block
      2. 模板包含include
      3. display() 四种方式
    2. 引入机制 import方法
    3. 验证码

    ?

    1. 用户登录
    2. 数据分页
    3. 缓存
    4. 多语言设置
    5. 自动完成、自动映射
    6. 面向切面编程理解

    【用户登录系统】

    ?

    1. 显示验证码

      技术分享

    2. 判断验证码

      技术分享

    3. 判断用户名和密码是否正确

      技术分享

      模型对应方法checkNamePwd()

      技术分享

    4. session操作

      技术分享

      cookie与session操作样子一致

    ?

    5. 退出系统逻辑

    技术分享

    【数据分页】

    1. 自定义分页类在框架中的使用

      技术分享

    2. 具体使用分页类

      技术分享

    ?

    【缓存使用】

    缓存:把数据库中的信息获取出来,放到一个缓冲介质里边,在相当一段时间之内,重复的数据就去缓存里边读取。

    ?

    缓存介质:内存、file文件、数据库

    ?

    不同的缓存介质,操作的方式不一样

    技术分享技术分享

    1. 具体使用:

    技术分享

    1. 缓存案例

      技术分享

    【多语言设置】

    1. 进行多语言配置config.php

      技术分享

    2. 配置行为Behavior执行

      技术分享

    3. 具体语言文件设置:

      技术分享

    4.具体语言使用????

    ????技术分享

    ????$language是在控制器通过L()函数传递的变量

    ????技术分享

    ????通过L()函数读取语言信息,传递给控制器

    ?

    【自动完成】

    收集表单信息,把数据存入数据库

    可以使用"自动完成"机制对即将入库的信息进行二次处理

    例如:密码加密、用户注册时间等等。

    ?

    自动完成 类似 表单验证

    表单验证在create()方法内部触发

    自动完成 也在create()方法内部触发

    ?

    技术分享

    【自动映射】

    技术分享

    ?

    自动映射和自动完成都通过create()方法触发。

    ?

    【面向切面编程】

    程序开发、执行不同的环节、不同的功能利用不同的文件进行处理。

    把一个大块的功能切割为小块进行开发、执行

    ?

    技术分享技术分享

    tag("app_begin");

    ????function tag()

    ????????配置tags变量信息

    ????????B()

    ????function B()

    ????????实例化行为Behavior,调用run()方法

    tags.php

    ?

    总结:

    1. 通过用户登录使用验证码
    2. 数据分页
    3. 缓存使用S()
    4. 多语言设置
    5. 自动完成、自动映射
    6. 面向切面编程Behavior分析

      tag()函数

    ????

    作业:

    1. 用户登录(后台,用户信息存入session,前台登录)
    2. 分页效果(后台、前台)
    3. smarty布局和include模板包含练习

    rbac:role base access (基于角色的用户权限控制)

    ThinkPHP

    ?

    RBAC (role base access) 基于角色的权限控制

    技术分享

    技术分享技术分享

    ?

    技术分享技术分享

    ?

    经理角色:"Company-show,Cat-mag,Product-list"

    3张数据表

    ?

    1. 模拟数据

      权限数据

      技术分享

    ????角色数据

    ????技术分享

    ????管理员数据

    ????技术分享

    ?

    1. 查询用户拥有的具体权限IndexAction-----left

      技术分享

    2. 控制器用户访问具体的模块和操作方法

      技术分享技术分享

      给普通控制器找一个父类,这个父类再继承Action

      技术分享

      ?

    3. 已有权限判断

      技术分享

    4. 给角色分配权限、表单、数据接收处理

      技术分享

    ?

    总结:

    1. 数据模拟权限控制
    2. 利用模拟数据进行权限控制
      1. 左边菜单按钮进行控制IndexAction.class.php left
      2. 具体模块---操作权限控制 AdminAction.class.php
    3. 为角色进行具体权限分配(控制、view视图模板、model接收处理数据distributeAuth()方法)

    ?

    manager 管理员

    role 角色表

    auth 权限

    ?

    【具体权限管理】

    添加权限:

    技术分享

    ?

    【系统管理员设置】

    ?

    开发步骤:

    1. 设置虚拟数据
    2. 通过虚拟数据设置权限
      1. 左边具体权限列表显示控制器(admin用户不限制)
      2. 在父类控制器AdminAction中对每个权限进行过滤控制(admin用户不限制)
    3. 通过"角色"分配具体权限 role
    4. 权限管理设置(分级显示权限-/)
    5. 三级权限设置管理
    6. 对管理员的角色设置

    ?

    ?

    ?

    ?

以上是关于ThinkPHP的主要内容,如果未能解决你的问题,请参考以下文章

Laragon实现快速创建ThinkPHP项目

php各种主流框架的优缺点

thinkphp2.x任意代码执行漏洞复现

php各种主流框架的优缺点总结

PHP四大主流框架的优缺点总结

php手记之01-tp5框架安装