1. 缓存
修改模版时要注意及时删除缓存,否则不能立即生效。
2.命名规范
类文件以.class.php为后缀,驼峰法命名,并且首字母大写,例如DbMysql.class.php。
函数、配置文件等其他类库文件之外的一般是以.php为后缀(第三方引入的不做要求)。
类名和文件名一致,例如 UserAction类的文件命名是UserAction.class.php, InfoModel类的文件名是InfoModel.class.php,
函数的命名使用小写字母和下划线的方式,例如 get_client_ip
Action控制器类以Action为后缀,例如 UserAction、InfoAction
模型类以Model为后缀,例如UserModel、InfoModel
方法的命名使用驼峰法,并且首字母小写,例如 getUserName
属性的命名使用驼峰法,并且首字母小写,例如 tableName
以双下划线“__”打头的函数或方法作为魔法方法,例如 __call 和 __autoload
常量以大写字母和下划线命名,例如 HAS_ONE和 MANY_TO_MANY
配置参数以大写字母和下划线命名,例如HTML_CACHE_ON
语言变量以大写字母和下划线命名,例如MY_LANG,以下划线打头的语言变量通常用于系统语言变量,例如 _CLASS_NOT_EXIST_。
数据表和字段采用小写加下划线方式命名,例如 think_user 和 user_name
特例:在ThinkPHP里面,单字母大写函数,通常是某些操作的快捷定义,或者有特殊的作用。例如,ADSL方法等等
3.配置
ThinkPHP提供了灵活的全局配置功能,采用最有效率的PHP返回数组方式定义,支持惯例配置、项目配置、调试配置和模块配置
惯例配置:系统内置有一个惯例配置文件(位于ThinkCommonconvention.php),按照大多数的使用对常用参数进行了默认配置。
项目配置:项目配置文件位于项目的配置文件目录(默认是Conf)下面,文件名是config.php。
调试配置:如果启用了调试模式的话,那么会导入框架默认的调试配置文件,默认的调试配置文件位于ThinkCommondebug.php。自定义项目配置文件位于conf/debug.php
分组配置:分组配置用于系统启用了分组模式的情况之下,对于每个分组可以单独定义自己的配置文件。分组配置文件位于:项目配置目录/分组名称/config.php
模块配置:
ThinkPHP支持对某些参数进行动态配置,针对这一特性,ThinkPHP还特别引入了模块配置文件的支持,这其实也是动态配置的体现。
模块配置文件位于:
项目配置目录/模块名(小写)_config.php // 用于不使用分组的情况
或者
项目配置目录/分组名/模块名(小写)_config.php // 用于使用分组的情况
读取配置:定义了配置文件之后,可以使用系统提供的C方法来读取已有的配置:
C('参数名称') // 获取已经设置的参数值
动态配置:在具体的Action方法里面,我们仍然可以对某些参数进行动态配置,主要是指那些还没有被使用的参数。
C('参数名称','新的参数值');
扩展配置:惯例配置如下 'APP_CONFIG_LIST' => array('taglibs','routes','htmls','modules','actions','tags'),
4.模块和操作
4.1基础
每个模块是一个Action文件,类似于我们平常所说的控制器,系统会自动寻找项目类库Action目录下面的相关类,如果没有找到,则会定位到空模块,否则抛出异常。
而actionName操作是首先判断是否存在Action类的公共方法,如果不存在则会继续寻找父类中的方法,如果依然不存在,就会寻找是否存在自动匹配的模版文件。如果存在模版文件,那么就直接渲染模版输出。
因此应用开发中的一个重要过程就是给不同的模块定义具体的操作。一个应用如果不需要和数据库交互的时候可以不需要定义模型类,但是必须定义Action控制器。
4.2 默认模块
系统的默认模块设置是Index模块,默认操作设置是index操作
4.3 模块分组
模块分组功能是为了更好的组织已有的模块,并且增加项目容量的一个有效机制。分组功能可以把以往的多项目合并到一个项目中去,这样一来,之前需要采用跨项目 操作的地方,现在因为在一个项目中从而免去了不少麻烦,并且公共文件的重用也方便了,并且每个分组都可以有自己独立的配置文件、公共文件、语言包,在 URL的访问上面也非常清晰。
要启用分组模块非常简单,配置下APP_GROUP_LIST参数和DEFAULT_GROUP参数即可。
例如我们把当前的项目分成Home和Admin两个组,分别表示前台和后台功能
'APP_GROUP_LIST'=>'Admin,Home',
'DEFAULT_GROUP'=>'Home',
4.3 URL模式
ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。
URL_MODEL 为0,采用传统的URL参数模式,http://<serverName>/appName/?m=module&a=action&id=1
URL_MODEL 为1,默认情况使用PATHINFO模式,ThinkPHP内置强大的PATHINFO支持,提供灵活和友好URL支持。PATHINFO模式根据不同的设置还包括普通模式和智能模式两种:
普通模式 设置URL_PATHINFO_MODEL 参数为1 ,该模式下面URL参数没有顺序,例如
http://<serverName>/appName/m/module/a/action/id/1
http://<serverName>/appName/a/action/id/1/m/module
以上URL等效
智能模式 设置URL_PATHINFO_MODEL 参数为2 (系统默认的模式),自动识别模块和操作,例如
URL_MODEL 为2,REWRITE模式,该URL模式和PATHINFO模式功能一样,除了可以不需要在URL里面写入口文件,和可以定义.htaccess 文件外。在开启了Apache的URL_REWRITE模块后,就可以启用REWRITE模式了,具体参考下面的URL重写部分。
URL_MODEL 为3,兼容模式,兼容模式是普通模式和PATHINFO模式的结合,并且可以让应用在需要的时候直接切换到PATHINFO模式而不需要更改模板和程序。兼容模式URL可以支持任何的运行环境。
4.4 URL路由
4.5 URL伪静态
系统支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行。例如,我们设置URL_HTML_SUFFIX 为 .shtml 的话,我们可以把下面的URL
http:///Blog/read/id/1
变成
http:///Blog/read/id/1.shtml
4.6 URL重写
通常的URL里面含有index.php,为了达到更好的SEO效果可能需要去掉URL里面的index.php ,通过URL重写的方式可以达到这种效果,通常需要服务器开启URL_REWRITE模块才能支持。
下面是Apache的配置过程,可以参考下:
1、httpd.conf配置文件中加载了mod_rewrite.so模块
2、AllowOverride None 将None改为 All
3、确保URL_MODEL设置为2
4、把.htaccess文件放到入口文件的同级目录下
- RewriteEngine on
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
4.7 URL生成
为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响。
4.8 URL大小写
系统本身已经提供了一个很好的解决方案,可以通过配置简单实现。只要在项目配置中,增加:
'URL_CASE_INSENSITIVE' => true
就可以实现URL访问不再区分大小写了。
4.9 空操作
空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
- Class CityAction extends Action{
- Public function _empty(){
- ...
- }
- }
4.10 空模块
空模块的概念是指当系统找不到指定的模块名称的时候,系统会尝试定位空模块(EmptyAction),利用这个机制我们可以用来定制错误页面和进行URL的优化。
Class EmptyAction extends Action{
4.11 前置和后置操作
前置和后置操作
系统会检测当前操作是否具有前置和后置操作,如果存在就会按照顺序执行,例如,我们在UserAction类里面定义了_before_insert() 和 _after_insert() 操作,那么执行User模块的insert操作的时候,会按照顺序执行下面的操作:
- _before_insert
- insert
- _after_insert
4.12操作链
ThinkPHP支持使用操作链的方式,例如,我们访问下面的URL:http://serverName/appName/User/action1:action2:action3/
那么会依次执行UserAction的action1 action2 action3方法,并且当前操作名称是最后一个操作。在进行默认模板输出的时候会用到。如果确实需要在不同的操作方法中都进行输出,请确保在 Action的display方法中指定需要渲染的模板文件名。否则,只能输出最后的操作模板。使用了操作链后,前置和后置方法会失效。
4.13 跨模块调用
在开发过程中经常会在当前模块调用其他模块的方法,这个时候就涉及到跨模块调用,我们还可以了解到A和R两个快捷方法的使用。
$User = A("User"); // 实例化UserAction控制器对象
$User->importUser(); // 调用User模块的importUser操作方法
这里的A("User") 是一个快捷方法,和下面的代码等效:
- import("@.Action.UserAction");
- $User = new UserAction();
事实上,在这个例子里面还有比A方法更简单的调用方法,例如:
R("User","importUser"); // 远程调用UserAction控制器的importUser操作方法
上面只是在当前项目中调用,如果你有需要在多个项目之间调用方法,一样可以完成:
- $User = A("User","App2"); // 实例化App2项目的UserAction控制器对象
- $User->importUser();
- // 远程调用App2项目的UserAction控制器的importUser操作方法
- R("User","importUser","App2");
4.14 页面跳转
在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面,系统的Action类内置了两个跳转方法success和error,用于页面跳转提示,而且可以支持ajax提交,使用方法很简单,举例如下:
- $User = M("User"); // 实例化User对象
- $result = $User->add($data);
- if ($result){
- // 设置成功后的跳转页面地址 默认的返回页面是$_SERVER["HTTP_REFERER"]
- $this->assign("jumpUrl","/User/list/");
- $this->success("新增成功!");
- }else{
- // 错误页面的默认跳转页面是返回上一页 通常可以不用设置
- $this->error("新增错误!");
- }
Success和error方法都有对应的模板,并且是可以设置的,默认的设置Public:success和Public:error,模板文件可以使用模板标签,并且可以使用下面的模板变量:
$msgTitle :操作标题
$message :页面提示信息
$status :操作状态 1表示成功 0 表示失败 具体还可以由项目本身定义规则
$waitSecond :跳转等待时间 单位为妙
$jumpUrl :跳转页面地址
如果是AJAX方式提交的话,success和error方法会调用ajaxReturn方法返回信息,具体可以参考后面的AJAX返回部分。
4.15 重定向
Action类的redirect方法可以实现页面的重定向功能。
redirect方法的参数用法和U函数的用法一致(参考上面的URL生成部分),例如:
$this->redirect('User/list', array('cate_id'=>2), 5,'页面跳转中~')
上面的用法是停留5秒后跳转到User模块的list操作,并且显示页面跳转中字样,重定向后会改变当前的URL地址。
4.16 AJAX返回
系统支持任何的AJAX类库,提供了ajaxReturn方法用于AJAX调用后返回数据给客户端。
并且支持JSON、XML和EVAL三种方式给客户端接受数据,通过配置DEFAULT_AJAX_RETURN进行设置,在选择不同的AJAX类库的时候可以使用不同的方式返回数据。
要使用ThinkPHP的ajaxReturn方法返回数据的话,需要遵守一定的返回数据的格式规范。ThinkPHP返回的数据格式包括:
status 操作状态
info 提示信息
data 返回数据
返回数据data可以支持字符串、数字和数组、对象,返回客户端的时候根据不同的返回格式进行编码后传输。如果是JSON格式,会自动编码成JSON字符 串,如果是XML方式,会自动编码成XML字符串,如果是EVAL方式的话,只会输出字符串data数据,并且忽略status和info信息。
下面是一个简单的例子:
- $User = M("User"); // 实例化User对象
- $result = $User->add($data);
- if ($result){
- // 成功后返回客户端新增的用户ID,并返回提示信息和操作状态
- $this->ajaxReturn($result,"新增成功!",1);
- }else{
- // 错误后返回错误的操作状态和提示信息
- $this->ajaxReturn(0,"新增错误!",0);
- }
注意,确保你是使用AJAX提交才使用ajaxReturn方法。
在客户端接受数据的时候,根据使用的编码格式进行解析即可。
新闻热点
疑难解答
图片精选