ThinkPHP5开发的正确姿势——PHP最佳实践的参考规范

安装篇

  1. 使用composer,既然是趋势就早日拥抱,能写PHP的这点工具用不来说不过去(另外官方的所有扩展都会以composer方式提供);
  2. 如果只需要核心单独安装核心框架就行了,应用仓库并非必须;
  3. 如果你安装的是dev-master,composer更新的也是开发版,如果安装的是正式版那么更新的也是最新的正式版(就和Chrome的开发版和正式版一样);
  4. 把web根目录指向public目录而不是根目录;
  5. 资源文件不要放到public目录以外;
  6. TP5完美支持PHP7,不要以为基于PHP7写的框架才会支持PHP7;
  7. 如果你的环境是PHP7,你的应用中完全可以使用PHP7的特性;
  8. 不要使用普通URL模式访问;
  9. TP5正常运行需要PHP5.4+,建议版本为PHP5.6+;

变量篇

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

路由篇

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

控制器篇

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

数据库篇

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

模型篇(上)

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

模型篇(下)

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

转载来自《ThinkPHP5快速入门教程》

转载于:https://my.oschina.net/lyaohe/blog/787010

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值