zoukankan      html  css  js  c++  java
  • ThinkPHP框架

    目录布局

    /index.php入口文件

    /ThinkPHP/框架目录

    Conf/

    Convention.php 默认(管理)配置

    /Public/浏览器可以直接请求的静态资源目录

    /Application/应用程序目录

    Common/公共模块

    Conf/公共配置,对于所有的平台都起作用

    Config.php

    Runtime/运行时生成的文件

    Home/前台

    Back/后台

    Conf/当前平台配置配置

    Controller/控制器

    Model/模型

    View/视图

    配置修改

    动作方法名后缀

    配置项:action_suffix

    默认(管理)配置:

    应该修改application/Common/Conf下的配置文件(convention.php):  'ACTION_SUFFIX'=>'Aaction';//操作方法后缀

    之所以定义在在Common的配置文件中,表示,不论任何模块内的动作名,都使用Action作为后缀!

    配置数据库服务器信息

    在:application/Common/Conf或者application/Back/Conf

    通用或者当前模块的配置文件中,完成对数据库服务器信息的配置。

    URL后缀

    模板的使用

    {}数据输出

    __PUBLIC__

    替换为Public目录地址!

    在模板被编译时,自动替换!

    建议在写URL路径时,使用该占位符完成URL路径的定义!

    <foreach>

    属性:

    Name=“变量名”

    表示:遍历的变量,通常是数组

    Item=”变量名”

    表示:每当遍历得到一个元素,赋值的变量

    例如:

    <foreach name="list" item="row">

    相当于

    Foreach $list as $row

    模板继承,extendblock,建议

    继承,重写两个概念

    出现在模板层面上的。

    布局模板(基础模板)

    建立布局模板(基础模板)。(基类父类)

    在基础布局模板中,使用block标签,表示该位置可以被重写的。

    语法如下:

    子模板(控制器中,display的模板)

    使用:

    Extend标签,来表示所继承的布局基础模板

    子模板,使用同名的block标签,重写,父模板中同名的block内容:

    继承&重写

    模板:子模板继承自布局(基础模板)。(类)

    block块:子模板中的block块重写布局(基础模板)的block块。(方法)

    模板载入,include

    Include标签可以完成模板载入

    使用file属性,表示对于的模板页!

    布局模板,layout{__CONTENT__},不建议

    提供基础的布局模板(类似于模板继承的父模板),在布局模板中,提供一个占位符。__CONTENT__

    子模板,来使用该布局模板。

    采用直接替换机制。

    相当于,只有一个block块的模板继承方案!

    站在:大多数框架的角度(例如:laravel),流行的模板继承,建议使用模板继承。

    模型的使用

    PDO

    Undefined const PDO::MYSQL_ATTR_INIT_COMMAND

    ThinkPHP底层的DAO(数据访问对象),分装PDO来实现的。

    要求,开启pdo_mysql支持:

    Apache httpd restart!

    ThinkModel类,定义在:

    M(),获得基础模型单例

    定义于框架中,公共函数库的一个函数。

    M,用于获取模型类的单例对象的!

    该方法执行时,需要当前模型名作为参数(通常模型名,就是表名,采用首字母大写的命名方法)

    所说的模型类:M函数,获得是 ThinkModel 模型基础类的对象。

    对应的CategoryModel称之为自定义模型类。

    使用M函数的原因:框架提供的基础模型类已经足够完成表的常规操作了。

    语法上:

    M定义在全局命名空间的。

    更合理的语法应该是 M();

    为什么直接写函数名时OK的?

    因为,函数,首先会在当前命名空间查找,如果没有,则会去全局(根)命名空间查找!(这个特性仅仅适用于函数)

    自定义模型

    需要模块的Model目录,创建独立的模型类文件!

    D(),获得自定义模型

    使用方法与M()一致,但是会优先尝试实例化自定义模型。

    D(“Category”),

    先:new CategoryModel

    如果自定义模型不存在,则会退而求其次,实例化基础模型:

    再:new Model;// M(‘Category’)

    $model->create()创建数据

    该方法,用来创建数据(对象),用来将数据关联到当前的模型对象上。

    测试结果:

    Create前:

    Create后:

    除此之外,create还会执行很多额外的操作:例如:数据验证,自动完成,等!

    语法上:

    Create()方法,应该接受一个关联数组,作为参数。典型情况,数据来源于POST数据,create会自动查找!

    建议:尽可能将表单的form元素的name设置为,数据表字段一致,ThinkPHP自动处理的越多!

    额外十分有用的操作

    除了将数据与对象关联上之外:还可以执行很多额外的操作:

    如图所示:

    步骤

    说明

    返回

    1

    获取数据源(默认是POST数组)

    2

    验证数据源合法性(非数组或者对象会过滤)

    失败则返回false

    3

    检查字段映射

    4

    判断数据状态(新增或者编辑,指定或者自动判断)

    5

    数据自动验证

    失败则返回false

    6

    表单令牌验证(防止表单重复提交安全选项)

    失败则返回false

    7

    表单数据赋值(过滤非法字段和字符串处理)

    8

    数据自动完成

    9

    生成数据对象(保存在内存)

    字段映射

    为了解决,表单中元素的name属性值,与数据表中字段名称对应不上的情况。

    Form

    Input name=”title”

    Table

    Subject varchar(24)

    $_POST[‘title’]

    判断数据状态

    判断当前需要执行的是插入,还是更新!

    自动判断:90%,依据是否存在主键,判断是否是更新或插入。存在主键则为更新,否则为插入!

    认为干预:向$model->create()传参。第二个参数为人为决定的状态,两个值:

    Model::MODEL_INSERT

    Model::MODEL_UPDATE

    自动验证,重点

    验证数据的合法性。

    自动在:

    允许用户,自定义验证规则,在调用create时,利用用户定义的规则,完成数据的合法性校验!

    操作上的核心:在于定义验证规则。

    规则定义在,模型中!

    通常,需要通过自定义模型,完成规则的定义:

    格式如下:

    二维数组,每个一维数组元素,就表示一条规则:格式如下:

    array(验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]),

    验证字段:

    验证规则:

    错误提示:

    此时调用create时,该验证规则自动完成!

    如果规则定义在自定义模型上,则需要使用D()函数来获得自定义模型:

    Create()方法一旦验证失败,返回false。

    同时使用模型的getError()方法,返回错误信息。

    验证规则

    关于自动验证规则的定义,分两套语法:

    常见规则(基本规则)和附加规则(扩展规则)

    常见规则:通常使用前三个元素即可即可

    附加规则:至少需要使用第五个参数。通常使用第二个参数配合第五个参数使用,第五个参数表示哪种规则,第二个参数表示该规则的选项。

    常见规则

    Require,必须

    url,URL

    number:数字,相当于int unsigned! 0, 正整数!

    扩展规则

    Length:长度,需要提供长度范围

    Unique: 唯一

    Regex:正则,需要提供正则表达式

    Between:是否在某个范围内,需要范围

    Confirm,判断两个字段是否相等。需要比较的元素名。

    通过自定义函数(方法)来设置规则:

    Function: 函数

    Callback:当前模型类方法

    验证条件

    当数据出现那种情况时,才会验证:支持:

    三种情况:

    存在才验证:0,MODEL::EXISTS_VALIDATE

    必须验证,不论是否存在:1,MODEL::MUST_VALIDATE

    值不为空时,才验证。2, MODEL::VALUE_VALIDATE

    多字段验证

    默认情况下,不支持多字段验证。一旦检验出来某条规则出错,则自动退出!

    如果需要将所有的规则都检验出来,再返回错误消息,就应该设置批量验证字段:

    此时,一旦出错,错误消息就使用数组表示:

    每个元素就是错误消息:

    字段=>消息

    通过拼凑错误消息,可以展示所有内容:

    表单令牌验证

    防止表单重复提交安全机制!

    表单数据赋值

    用于过滤非法字段!

    数据自动完成,重要

    为字段设置默认值,通常使用在插入,或者是自动更新的某些字段上。

    例如:update_time 表示更新时间!

    需要在定义模型上,定义属性:

    $_auto; 完成!

    生成数据对象

    将数据与模型对象关联!

    $model->add()

    形成insert语句,完成添加!

    通过模型的fetchSQL方法,获得所拼凑的SQL,用于调试!

    执行fetchSQL时,不会真正执行insert语句的,用于调试!

    语法上:thinkPHP使用了大量的连贯操作语法形式!

    一个对象调用方法后,再调用方法:

    $result_add = $m_category->fetchSql(true)->add();

    实现:仅仅需要fetchSQL()返回对象即可!

    最终的返回值为最后一次调用的返回值!

    $model->add()返回值为:最新生成的自动增长ID!

    $model->find()查一条

    查找一条,通常利用主键查询

    $model->select()查列表

    $model->where()->order()->limit()->select()

    检索符合条件的所有数据

    支持再此之前,通过连贯操作,对查询进行设置。

    Select * from table-name where $cond group by $group having $having order by $order limit $offset,$limit;

    $model->order()

    排序的方法

    $model->delete()

    根据条件或者主键进行删除

    如果没有主键,利用条件的话:使用where()作为连贯操作

    $cond['id'] = 10;

    $m_category->where($cond)->delete();

    $model->save() 更新

    完成更新的操作!

    $model->limit($offset, $pagesize)

    拼凑select语句的limit部分!

    $model->page($page, $pagesize)

    对limit 封装,page内,自动算$offset = ($page-1) * $pagesize;

    $model->count();

    用于获符合合条件的记录数

    可以通过where连贯操作,提供条件

    $model->where()->count();

    $model->where()

    配合:查询,删除,更新来使用

    $cond

    $model->where($cond)->select();

    $model->where($cond)->delete();

    $model->where($cond)->save();

    其中条件的写法,有两种:

    之一:字符串:

    Id>10

    之二:数组,建议。强烈建议。1,数据安全性更容易被保证。2,其他(牛逼)的框架都这样。

    $cond[‘id’] = array(‘gt’, 10);

    写法如下:

    典型写法:

    $cond['字段名'] = array('表达式','查询条件');

    表达式就是运算符:

    表达式含义协助记忆

    EQ 等于(=) equal

    NEQ 不等于(<>) not equal

    GT 大于(>) greater than

    EGT 大于等于(>=) equal or greater

    LT 小于(<) less than

    ELT 小于等于(<=) equal or less than

    LIKE 模糊查询

    [NOT] BETWEEN (不在)区间查询

    [NOT] IN (不在)IN 查询

    EXP 表达式查询,支持SQL语法expression

    例如:

    空数组:

    大于:

    In

    Between

    Like:自动转义!

    多个条件的情况

    增加多个元素即可!

    条件间为:AND 的关系。

    如果需要修改为OR 逻辑关系,需要使用:

    非单一的逻辑关系,混合的逻辑关系:

    _complex(复杂)

    默认的,如果字段对应的是一个具体指,就表示等于关系

    $cond[field] = 10;

    $cond[field] = array(‘eq’, 10);

    ThinkPHP的跳转

    使用控制器的跳转方法完成:

    一下两个方法,都定义在基础的控制器类中:

    ThinkController

    $this->success();

    成功后的跳转

    需要的参数:为提示信息,和目标URL

    $this->error();

    失败时跳转:

    需要的参数:提示信息,和目标URL

    URL处理

    基础模式

    通过get参数,m,c,a表示分发参数!

    为了搜索引擎,或者用户,优化URL,更加简洁,更加容易记,更加美观,更加具有逻辑含义。

    ThinkPHP采用默认的pathinfo的模式,形式使用/分割不同的参数:

    Pathinfo模式

    ThinkPHP默认的URL模式

    URL后缀

    在URL上,增加任意的后缀,表示不同的格式:

    默认的后缀就是html

    可以被配置的:

    通过增加配置项:

    U()

    在ThinkPHP中,建议(强烈建议)所有的URL,都使用该函数生成。原因是在ThinkPHP中对对URL存在很多配置:例如,URL模式,URL后缀!

    U(‘Module/Controller/action’, array(p1=>v1, p2=>v2))

    参数一:分发参数

    参数二:get参数数组

    使用函数,可以自动生成符合ThinkPHP规范的URL。

    如果需要在模板中,生成URL,则需要使用:

    {:U()}

    在函数前写 : 表示该位置调用函数的意思!

    不仅仅对应于U函数,所有的函数都可以这么调用!

    浏览器输入数据的处理

    I()

    获取请求数据

    I(‘post.key’);

    $_POST[‘key’]

    I(‘get.key’);

    $_GET[‘key’]

    I(‘get.key’, ‘default_value’)

    Isset($_GET[‘key’]) ? $_GET[key] : ‘default_value’

    配置系统

    C(‘KEY’)

    获取KEY对应的配置项的值

    如果是用户自定义的配置项,需要在配置文件中,定义好才可以!

    分页实现

    数据

    $model->page()

    $model->limit();

    翻页

    利用系统提供的翻页类:

    Pathinfo

    是URL的一部分。

    一个典型的URL如下:

    http://blog.hellokang.net:8888/path/to/script.php/module/controller/action/k1/v1/k2/v2.html?p1=v1&p2=v2#tag

    协议:http

    域名:blog.hellokang.net

    端口:8888

    脚本路径:/path/to/script.php

    pathinfo:/module/controller/action/k1/v1/k2/v2.html

    请求参数(查询字符串,query string):p1=v1&p2=v2

    锚点:#tag

    其中:脚本与查询字符串间的部分称之为pathinfo!

    任何web程序,都可以获取到pathinfo的:

    例如:PHP,

    $_SERVER[‘PATH_INFO’];

    ThinkPHP程序中:通过获取到的pathinfo字符串,进行分析,判断当前的分发参数:

    由:ThinkPHP的分发类完成:

    ThinkDispatcher

  • 相关阅读:
    通过jQuery修改ui的顺序
    iOS用模型取代字典的好处
    iOS开发NSBundle、UIImageView和UIButton总结
    php数组中关于某个元素进行排序
    VMware 11安装Mac OS X 10.10
    js中的in_array
    localStorage中js数组的存储和读取
    google地图通过js计算当前位置与其余多个点之间的最近距离
    通过js修改图片的css样式,实现简单的图片旋转
    Javac不是内部或外部指令
  • 原文地址:https://www.cnblogs.com/yyjie/p/8493501.html
Copyright © 2011-2022 走看看