企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# ThinkPHP5开发的正确姿势 > ### 本篇的建议旨在让你的ThinkPHP5开发更规范和顺利,但仅仅是建议,而不是必须。(内容会不断补充) ## 变量篇 1. 避免直接获取系统变量,用`Request`对象的相关方法替代; 2. 不用`get`或者`post`方法获取请求变量,而是用`param`方法替代; 3. 使用操作方法的参数绑定功能,而不是自己手动获取请求参数; 4. 使用依赖注入和`Request`属性注入; 5. 用Request类的`getInput`方法替代`file_get_contents('php://input')`; 6. 模板中输出系统变量使用`{$Request.param.name}`的方式; 7. 多使用Request类的`only`和`except`方法获取多个请求变量; ## 路由篇 1. 用动态注册方法而不是路由配置; 2. 不要在路由配置文件之外定义路由; 3. 用`get`/`post`/`delete`/`put`等路由注册方法明确指定请求类型; 4. 保证路由变量和操作方法的参数绑定命名一致(包括可选); 5. 路由地址保持和实际的控制器名和方法名一致(包括大小写); 6. 为每个路由变量明确指定变量规则; 7. 用路由分组简化路由定义和公共参数; 8. 尽可能使用强制路由并配合MISS路由; 9. 优先考虑资源路由尤其是API开发的时候; 10. 考虑在路由后置行为中进行统一的权限检测; 11. 部署后记得执行路由缓存指令; ## 控制器篇 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. 遵循驼峰法命名你的控制器类和文件名; ## 数据库篇 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)的话缓存是自动更新的; ## 模型篇 不要以为模型性能比Db差,这点差别还不抵不过一条SQL查询,而带来的便利是乐观的; 模型的好处千言万语抵不过两个字:对象(明白人都会懂);