ThinkPHP5开发注意事项

关键字:
操作方法的参数绑定功能
Request属性注入
用Request类的getInput方法替代file_get_contents('php://input');
永远不要在操作方法中(事实上是任何代码中)使用exit;

使用composer,是趋势
应用仓库并非必须;
把web根目录指向public目录而不是根目录;资源文件不要放到public目录以外;
TP5完美支持PHP7,TP5正常运行需要PHP5.4+,建议版本为PHP5.6+;
不要使用普通URL模式访问;

变量篇

避免直接获取系统变量,用Request对象的相关方法替代;
不管get还是post请求,统一用param方法获取当前请求(任何请求类型)变量;
不要直接操作改变当前请求的系统变量;
使用操作方法的参数绑定功能,而不是自己手动获取请求参数;
使用依赖注入(TP5的依赖注入非常的简单);
对于一些请求用到的公共属性可以使用Request属性注入;
用Request类的getInput方法替代file_get_contents('php://input');
模板中输出系统变量使用{Request.param.name}的方式; 多使用Request类的only和except方法获取多个请求变量; 不要直接操作_SESSION变量;
任何变量必须事先定义才能操作或者赋值给模板;

路由篇

用动态注册方法而不是路由配置;
不要在路由配置文件之外定义路由;
用get/post/delete/put等路由注册方法明确指定请求类型;
保证路由变量和操作方法的参数绑定命名一致(包括可选);
路由地址保持和实际的控制器名和方法名一致(包括大小写);
为每个路由变量明确指定变量规则;
用路由分组简化路由定义和公共参数;
尽可能使用强制路由并配合MISS路由;
优先考虑资源路由尤其是API开发的时候;
考虑在路由后置行为中进行统一的权限检测;
部署后记得执行路由缓存指令;
了解下路由的请求缓存对你会有帮助;

控制器篇

建议开启controller_suffix配置参数,并采用IndexController命名控制器类;
原则上控制器类不需要继承think\Controller;
给你的控制器类继承一个公共的基类例如Base便于统一调整;
需要的话在你的基础控制器类中引入traits\controller\Jump;
API开发尽量使用资源控制器(命令行php think create:controller 可以快速生成);
控制器类中避免写太多的业务逻辑,交由模型类完成;
尽量避免直接操作数据库类,而是在模型类中做好封装;
可能的话尽量在控制器层完成数据验证;
不要试图在初始化方法中调用redirect助手函数,而用$this->redirect方法替代;
始终在控制器方法中return而不是echo以免影响请求缓存;
用json、view以及redirect助手函数进行响应输出;
用abort助手函数抛出HTTP异常;
遵循驼峰法命名你的控制器类和文件名;
永远不要在操作方法中(事实上是任何代码中)使用exit;

数据库篇

千万不要用驼峰法命名数据表和字段;
如非必要避免直接操作Db类;用Db类的name方法而不是table方法;
用视图查询view方法替代join方法;
查询操作尽可能的使用field方法,哪怕是field(true);
如果要批量执行SQL语句使用batchQuery方法;
用value方法获取单个记录的某个字段值;
用column方法获多条记录的某个(或者某些)字段值;
灵活使用cache方法进行查询缓存处理和删除(不仅是查询可以用cache方法);
使用fetchSql方法直接返回sql语句而不实际执行CURD;
部署之后记得执行命令行的php think optimize:schema指令;
strict方法可以避免多余的数据字段抛出异常;
关于日期和时间的查询不妨试试whereTime方法;
数据库的大多数操作都是自动参数绑定的,一般情况下无需手动使用bind方法;
insert方法返回的是影响的记录数而不是主键;
使用insertGetId方法插入数据并返回主键;
delete(true)可以无条件的删除数据;
select和find方法支持闭包,但尽量不要和链式操作混用;
需要查询大量数据并且分批处理的话使用chunk方法;
对find方法使用主键查询并且cache(true)的话缓存是自动更新的;

模型篇

不要以为模型性能比Db差,这点差别还不抵不过一条SQL查询,而带来的便利是可观的;
模型的好处千言万语抵不过两个字:对象(明白人都会懂);
模型类一般直接继承think\Model,如有必要也可以继承一个公共模型基类;
如果你的模型类没有任何的数据库操作的话不需要继承任何类库;
模型类不需要使用类后缀Model(对应前面的控制器类后缀);
模型的save方法既可以新增也可以更新(而且是自动识别);
模型没有链式操作,所有链式操作都是调用的数据库类Db;
模型支持事件而数据库类的操作不支持事件;
统一在模型的init方法(静态方法)中注册模型事件;
模型没有数据表前缀的概念只有对应数据表(完整表名)的概念;
每个模型对应一个数据库查询对象Query,彼此独立;
每个模型可以单独定义自己的数据库连接信息;
模型名不一定就是数据表名,而且可以单独定义数据表名称;
模型查询的数据返回永远都是当前模型对象实例(而不是数组,Db类查询才是数组);
模型对象可以直接进行数组操作并不需要使用toArray转换(包括模板输出);

模型的查询操作建议使用get和all方法(静态方法);
要在模型查询中使用链式查询可以定义查询范围或者使用闭包;
用save方法新增数据的返回值是影响的记录数而不是主键值,获取主键直接获取当前模型对象的属性值即可;
如果仅仅是需要主键之外的查询条件的话,可以在get或者all方法的第一个参数使用数组;
要模型查询后的原始数据可以使用getData方法;
模型的关联操作可以让你省去很多的关联查询;
鉴于性能考虑,关联预载入查询绝对是关联查询的首选;
一对一的关联关系,尤其是主表和附表的关系考虑使用聚合模型;
软删除必须使用模型的delete方法(而不是数据库类的delete)才有效;
不要在修改器中修改多个属性;
修改器是模型才有的功能,调用数据库Db类的写入操作方法是不会触发的;
不要在同一个模型实例中多次调用save新增数据,一旦新增数据成功后,再次save就是更新数据了,除非你显式调用isUpdate(false);
用模型事件取代自动完成;

其它篇

开发过程中开启调试模式,部署后记得关闭;
如果不是API开发的话开启页面Trace显示;
不要轻易忽视异常页面的任何信息,它们不是摆设;
开发中一定要严格注意大小写,这是基本素质;
如果是接口开发尝试使用 postman 进行调试;
使用命名空间和自动加载,避免直接 require 及 include ;
不建议使用 import 和 vendor 方法;
应用目录下面的common.php(注意不是command.php)可以添加应用的函数,并且实时生效;
不要手动下载扩展包放入vendor目录,不支持composer安装的扩展类库直接放入extend;
只要是使用命名空间的第三方类库,都是可以直接在TP5下面使用的;
尽可能的采用MVVM设计架构来替代MVC架构,充分发挥TP5的API优势;
如果使用模板,避免在模板中使用过多的数据逻辑;
模板继承和模板布局是可以配合使用的;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容