介绍
在团队协作的项目中,代码规范是必要的。以前做项目规范都是自己定的,然后手动去检查,这样的效率是非常低的,很难做到协调统一
现代的PHP,则有得到广泛认可的编码规范:PSR-1,PSR-2
同时也有配套的包,squizlabs/php_codesniffer可以自动检查代码是否符合规范,并能自动修复不规范的代码(两个功能:1.检查代码是否符合规范,2.修复不规范的代码!)
结合brainmaestro/composer-git-hooks,可以进一步做到,在git commit的时候,自动检测代码是否符合规范
代码规范检查与修复
安装phpcs包
composer require squizlabs/php_codesniffer --dev
这个包,包含了两个工具
1.phpcs用于检查代码规范
2.phpcbf用于根据代码规范修复代码
工具位于vendor/bin/目录(vendor目录是老朋友啦,laravel框架内核包括composer扩展包的源文件都是在这个目录下),假设要检查app/目录下的代码是否符合规范,执行
.vendor/bin/phpcs --standard=PSR1,PSR2 app/ routes/ config/
其中--standard于检查规范时使用的标准,
这里使用PSR1(基础编码规范)和PSR2(编码风格规范)。而app/,routes/和config/是laravel工程的代码目录,即你要检查的目录,因为我们编写的最多的一般是这几个文件,所以这里要写这几个,但是如果你用的是laravel-modules扩展包,则还需要加个Modules目录。
手动修复代码规范是一件很累人的事,一般是先通过自动修复,对于修复不成功的再手动修复,执行一下命令可以执行自动修复
.vendor/bin/phpcbf --standard=PSR1,PSR2 app/ routes/ config/
有些规则,phpcbf无法自动修复,而我们改起来又十分烦琐,可以考虑自定义这些规则。比如上面截图中的一行不能超过120个字符的这条规则(这条规则是PSR2定义的),无法被自动修复,但不论是第三方包,还是我们自己写的代码(通常是注释),超过120个字符的非常多,一一修复就太累了。于是修改了该条规则,将数值扩大到240。
具体方法是在根目录下创建ruleset.xml文件,拷贝以下内容
<ruleset name="Custom">
<description>Zend, but without linelength check.</description>
<rule ref="Generic.Files.LineLength">
<properties>
<property name="lineLimit" value="240"/>
<property name="absoluteLineLimit" value="0"/>
</properties>
</rule>
</ruleset>
然后在执行代码检查时,在--standard参数附上自定义规则文件路径
.vendor/bin/phpcs --standard=PSR1,PSR2,./ruleset.xml app/ routes/ config/
每次要敲这么长的命令并不方便,一般是写在composer.json中,通过composer lint执行代码检查,通过composer lint-fix修复代码。要实现这样的效果,修改composer.json, 在scripts增加
"scripts": {
// 省略其他部分...
"lint": "phpcs --standard=PSR1,PSR2,./ruleset.xml app/ routes/ config/ ",
"lint-fix": "phpcbf --standard=PSR1,PSR2 app/ routes/ config/ "
}
然后执行composer lint和composer lint-fix就能自动检查代码或者修复代码规范