WAS项目规范.md 7.7 KB

全局

PHP中长文本如无拼接必要性使用定界符(<<<)来声明
定义在模型或任意位置的常量都为业务逻辑服务,应该谨慎操作任何常量的变更

##命名

支持中文命名
    取消IDE中的Non-ASCII验证
    布尔值,返回布尔值的方法开头附加is
    复数,名词后跟“列"字
中文方法命名
    方法命名必须是动词、动词+名词、动词+名词+副词/定语结构;副词/定语放在后边可以以下划线分隔,例如:提交用户信息_后台运行()
    (超长的中文命名的方法,或不能以动词开头的方法,可能是方法本身的设计有误,尝试解耦设计,条件用参数等方式解决)
    模型中的方法可以使用名词,意为以方法当作属性字段
动作方法的命名
    用及物动词,不及物动词都可以,可以有副词在动词前后,不能是“名词前动词后”描述动作,或不能“名词+形容词”来描述动作
代码命名
    文件命名统一为驼峰单数命名且首字母大写(视图文件非大写)加对应功能块名称(例如:user模块:Model:User  controller:UserController service:UserService)
    数据库命名:表名为复数,多词使用下划线连接,中间表为单数(对于中间表而言建议根据首字母在26个英文字母中的顺序排列连接表)

##控制器

限制
    仅放请求
        页面
        API请求
        GET\POST等请求
        转发但可以单独作为请求的方法
方法命名
    显示页面(最后return为view()或直接显示的字符串的),命名以Page结尾。(框架标准CRUD不算)
    API请求,命名以Api结尾,路由放在apiLocal文件下
方法空间
    路由前缀应当对应同名控制器,一级前缀与控制器保持一致
模型对象的操作
    已有对象的,并且直接赋值模型对象的,不建立服务,直接使用 $对象->update(['字段名'=>值,'字段名2'=>值])

##验证

##服务

服务不能传入Request,不能返回Builder。以可以明确测试,以及明确缓存
注册
    必须在AppServiceProvicder中用app()->singleton绑定为单例;在控制器使用时可以在参数处依赖注入,也可以用app()实例化,使用app()实例化的,在其上用/**@var 类型 参数名 **/   进行注释以使其可以关联提示;服务中调用其他服务的,也用app()进行实例化并且用@var注释
    注册字符串名称大写开头
对象命名
    在控制器中调用时,如服务与控制器同前缀名的,服务器对象统一命名:$service,服务与控制器不同前缀名的不可以这样命名对象

##视图

路径文件夹与文件命名

##方法

方法应该按照其作用域来规定其属性,例如:对于后端而言仅供类内部调用的方法应该使用private,对于前端而言仅供其他函数调用的方法应该使用下划线(_)开头命名

##Request处理

参数调用
    ($request用链式调用(->)更好?)
    在调用处使用$request['input名称']这种方式,取得GET/POST请求参数;不需要重命名给新变量。

##页面

调用
    每个页面必须有一个同名控制器方法调用,一对一关系,不可以一个控制器调用多个页面。如有需要跳转的,由控制器进行redirect()方法跳转

##异常处理

页面调用
    throw new \Exception('错误描述'),即可自动调用错误页,一般不需主动调用
404
    仅在页面无法找到时调用(一般由框架自动调用),普通错误不可使用

##日志

日志统一使用app('LogService')->log()方法
日志记录发生在update, create, delete等增删改库的方法中必须使用;其他请况酌情使用
Excepiton异常时会自动日志,不需手动记录。除非要记录的标记不仅Request请求
第一,二个参数必须为 __METHOD__, __FUNCTION__ ;在闭包中,以字符串输入或转入参数的方式描述当前所在实际方法。
第三个参数为描述,以拼接的方式描述当前行为,必须描述当前关键标识字段(可以作为寻找问题时定位的)名,以及拼接出其值,API请求的,需要在进入请求时记录,记录关键标识,并拼接“request:”并用Json_encode()编码$request()->getContent();有外部请求的,在外部请求完成后final{}中进行日志,记录关键标识,拼接"response:",并且拼接Json_encode()“编码拼接$response->body()
插入新记录
    所有模型插入新记录时,如有多条循环插入情况,应当将该逻辑(循环外)用try catch final 包裹,日志记录写在final中,每条成功的放在一个数组里,由final一次请求记录(将成功数组JSON化)

##外部请求

必须用try{}catch(){}final{}处理,catch中必须处理请求失败的逻辑, final中日志记录response

##前端

布局,宽高等涉及样式呈现的,不使用HTML属性,使用bootstrap样式,bootstrap无法实现手动追加样式。(如 align="center",使用class="text-center",)

##JS

JS中双等号写成三等号(全等)

##模型

有外键关系的自字义自段,不添加至$appends,仅存在为getAttrbute()方法,如需要调用,在相应结果集添加with(''),前端在{!! !!}调用完默认结果集后,@foreach循环再追加这些自定义自段
使用$appends的属性,如有外键关系方法被调用,应当在之前增加"$this->外键方法->相应字段"这种方式优先调取(当作属性使用而不是方法), 外部使用with(将关联表注明)
不能使用get开头的自定义方法,需要用到的用框架定义的getXXXAttribute()这种方式
模型关系的定义
    注意相互的从属关系:hasOne是父模型对于子模型的定义,belongsTo是子模型对于父模型的声明(一般而言:本表存在关联表的外键使用belongsTo,关联表存在本表的外键使用hasOne)
    建议:对于超长模型命名可忽略同级的前缀。(示例:user与userLog 模型关系可直接称之log)
关联查询
    慎用whereHas进行查询,whereHas生成的sql是 where exists 进行关联查询,当左表大于由右表时,左表就会成为性能瓶颈。where exists 会将右表查出来的结果同左表匹配。查出多少条就会匹配多少次。而且不走索引的全表扫描。
    建议先查出右表,再根据关联关系查左表。 

##控制台命令

将命令的实际逻辑写成Service方法,方便复用调用和测试

##数据库

字段类型,以_id为结尾的,或指向外部id的外键关系字段,必须是bigint

##GIT

每个需求描述完成时,要执行一个Commit并在描述中阐明。
每个需求修改提交一个commit

##测试

每个Service方法均需写一个对应的测试
每个Service在Tests,Services文夹下,建立对应名文件夹,一个方法对应一个测试文件
测试原则是自己生产自己销毁:使用数据不依赖环境数据,不影响环境数据
每个方法可以超过一个文件,如果N个是在基镜中需要配置相同假数据的,可以放在一个文件,不需要或其他假数据的,可以再做一个文件
同方法的多文件,在后缀Test之前用下划线_标注区分
windwos下调用测试,在命令行运行phpunit.bat ,空格后跟要测试的目标包(包可以phpunit.xml定义)

##缓存

缓存在service层以上使用,模型层内不使用
缓存在CacheService中,getOrExecute调用,第2个匿名函数放没有缓存时运行的实际逻辑
模型中的读取方法如需缓存,应在对应的Service中设置同名方法处理

##导出Excel表

默认应使用JSON方式,仅在以下两种情况用SQL:
> A 在之后发现性能跟不上等障碍
> B 在开发时明确发现必须用SQL的需求