Laravel 复杂项目开发规范
项目规范
扩展包
严禁在项目中新增任何生产环境扩展包
所需要用到的扩展在项目规划初期就已经包含,如果真没有,请沟通解决
如果需要引入用于测试的扩展,请加上 --dev 参数
composer require laracasts/generators --dev
测试用的服务提供者,清手动注册,并加上环境判断:
public function register()
{
if ($this->app->environment() == 'local') {
$this->app->register('Laracasts\Generators\GeneratorsServiceProvider');
}
}
配置信息与环境变量
牢记以下几条:
1、环境相关配置一律放到 .env 文件中,其他地方不准放,记得同步到 .env.example
2、只允许在配置文件中读取 .env 文件,其余地方严禁使用 env()
3、所有程序配置放到配置目录中,并一律使用 config() 获取
4、数据库配置读取,一律使用 db_config() 获取
5、不要在配置文件里面写闭包
重要:不要在配置文件以外的任何地方使用 env(),所有环境变量在配置文件中都有,用 config() 来取。否则会影响上线之后的配置缓存。
辅助函数
严禁编写任何辅助函数,你没有任何情况会用到它们。
业务相关的放到 Services 层,数据相关的放到 Repository 层,哪怕是工具也封装到 Class 里面去,参考 Laravel6.* 中的 Arr 和 Str 工具类。
工具统一
请使用 PHPStorm,把代码提示(ide-helper)和框架插件(laravel)装上。
请把键位都调整为 sublime-text(macOs),不然结队编程的时候别扭。
请把键盘的 command 键位放到空格键的左边第一个,不然别人来你电脑上操作贼别扭。
其他随意。
编码规范
路由
牢记以下几点:
1、严禁在路由文件中写任何闭包
2、Restful 规则记不住的,路由命名不规范的,发现了就后果很严重
3、严禁使用 resource 定义路由,宁愿多打两行,否则容易出现空路由,且不好写注释
4、路由命名必须写,路由注释必须写
路由模型绑定
能用的地方必须用,字段有差异的去 app/Providers/RouteServiceProvider.php 的 boot 里面自定义。
public function boot()
{
Route::bind('user_name', function ($value) {
return User::where('name', $value)->first();
});
Route::bind('photo', function ($value) {
return Photo::find($value);
});
parent::boot();
}
模型 Model
命名规范
- 数据模型类名
必须
为「单数」, 如:App\Models\Photo
- 类文件名
必须
为「单数」,如:app/Models/Photo.php
- 数据库表名字
必须
为「复数」,多个单词情况下使用「Snake Case」 如:photos
,my_photos
- 数据库表迁移名字
必须
为「复数」,如:2014_08_08_234417_create_photos_table.php
- 数据填充文件名
必须
为「复数」,如:PhotosTableSeeder.php
- 数据库字段名
必须
为「Snake Case」,如:view_count
,is_vip
- 数据库表主键
必须
为「id」 - 数据库表外键
必须
为「resource_id」,如:user_id
,post_id
- 数据模型变量
必须
为「resource_id」,如:$user_id
,$post_id
利用 Trait 来扩展数据模型
模型本身只允许存放框架本身提供的方法及属性,例如:
1、允许填充字段等属性
2、模型关联的所有方法
3、访问器、修改器、转换器
4、定义查询范围
...
超出的范围的方法,如果涉及到业务往 Services 层放,把模型注入到 Service 来操作。不涉及业务的往 Trait 或者 Repository 层放,这取决于实际情况。
关于 SQL 文件
不要直接操作数据,不要直接导出 SQL,不要直接模拟数据
控制器
前台控制器命名使用复数形式,后台控制器命名使用单数形式。例如:
前台:PhotosController、UserPhotosController
后台:PhotoController、UserPhotoController
这方方便快速定位文件。
牢记以下几点:
- 方法命名要有可读性,哪怕长一点
- 方法内部请认真写注释,写清楚原因、作用
- 控制器中不要写「私有方法」,里面只应该存在「路由动作方法」,和路由一一对应
- 没有的方法就注释整体掉,注明是为什么注释的
特别注意:严禁多个路由对到同一个控制器方法,同样的,严禁多个转换层对到同一个控制器方法
用户认证
用户认证请放到控制器层,例如:
public function __construct()
{
$this->middleware('auth', [
'except' => ['show', 'index']
]);
}
Restful 真不适合把用户认证放在路由中,这样会把同一个资源的路由写的很散。将来应用的发展趋势也一定是减少需要登录才能访问的功能。
表单验证
简单的查询逻辑不用写验证,手动考虑条件为空的情况。其他所有情况必须使用「表单请求验证类」。
验证类可以使用以下方式缩减代码量:
public function rules()
{
switch($this->method())
...
授权策略
必须使用授权策略来做用户授权。发现越权操作数据的情况,后果很严重。在控制器中尽量用 authorize 方法做判断,当然你也可以用$user->can()。
测试
程序员必须自己做线上测试,然后才到业务测试,有些细节只有程序员自己知道。