# 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查询,而带来的便利是乐观的;
模型的好处千言万语抵不过两个字:对象(明白人都会懂);
- 脕茫隆垄脨貌脩脭
- 脕茫隆垄脨貌脩脭
- 脪禄隆垄禄霉麓隆
- 脪禄隆垄禄霉麓隆
- 露镁隆垄URL潞脥脗路脫脡
- 露镁隆垄URL潞脥脗路脫脡
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脠媒隆垄脟毛脟贸潞脥脧矛脫娄
- 脣脛隆垄脢媒戮脻驴芒
- 脣脛隆垄脢媒戮脻驴芒
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脦氓隆垄虏茅脩炉脫茂脩脭
- 脕霉隆垄脛拢脨脥潞脥鹿脴脕陋
- 拢篓1拢漏脛拢脨脥露篓脪氓
- 拢篓2拢漏禄霉麓隆虏脵脳梅
- 拢篓3拢漏露脕脠隆脝梅潞脥脨脼赂脛脝梅
- 拢篓4拢漏脌脿脨脥脳陋禄禄潞脥脳脭露炉脥锚鲁脡
- 拢篓5拢漏虏茅脩炉路露脦搂
- 拢篓6拢漏脢盲脠毛潞脥脩茅脰陇
- 拢篓7拢漏鹿脴脕陋
- 拢篓8拢漏脛拢脨脥脢盲鲁枚
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 脝脽隆垄脢脫脥录潞脥脛拢掳氓
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 掳脣隆垄碌梅脢脭潞脥脠脮脰戮
- 戮脜隆垄API驴陋路垄
- 戮脜隆垄API驴陋路垄
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐隆垄脙眉脕卯脨脨鹿陇戮脽
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐脪禄隆垄脌漏脮鹿
- 脢庐露镁隆垄脭脫脧卯
- Cookie
- Session
- 碌楼脭陋虏芒脢脭
- 脥录脧帽麓娄脌铆
- 脦脛录镁脡脧麓芦
- 脩茅脰陇脗毛
- 赂陆脗录
- A隆垄鲁拢录没脦脢脤芒录炉
- B隆垄3.2潞脥5.0脟酶卤冒
- C隆垄脰煤脢脰潞炉脢媒
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路卢脥芒脝陋拢潞脩搂脧掳ThinkPHP5碌脛脮媒脠路脳脣脢脝