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()。

测试

程序员必须自己做线上测试,然后才到业务测试,有些细节只有程序员自己知道。

你可能感兴趣的:(Laravel 复杂项目开发规范)