触发器书刊
每晚与你撷取 IT开卷 控制技术蔬果 婚恋科学知识
点选相片旧书
我坚信每一子公司都有一套完整的标识符规范化国际标准,但国际标准是国际标准,怎样能有效率的让其他人严格遵守,那要是远距工具的远距和动态告诫了。
如后端 vue 的我们基本上单厢采用eslint来束缚他们的标识符,除非多两个字符单厢提示信息你有难题,当npm run dev或是npm run watch就会提示信息你哪哪哪不符合要求化。
在 Laravel 合作开发中,就算也有类似于的远距工具,这也是责任编辑的首先需要所推荐的:phpcs
在已经开始采用phpcs以后,他们单纯而言说 Laravel 的标识符规范化国际标准
Laravel 标识符规范化Laravel follows the PSR-2 coding standard and the PSR-4 autoloading standard.
源自 Laravel 的表明:https://laravel.com/
两个标识符规范化的涵义
PSR-0 自动加载规范化 (已弃用)
PSR-1 基础编码规范化
PSR-2 编码风格规范化
PSR-3 日志接口规范化
PSR-4 自动加载规范化
PSR-5 PHPDoc 国际标准 (未通过)
PSR-6 缓存接口规范化
PSR-7 HTTP 消息接口规范化
PSR-8 Huggable 接口 (未通过)
PSR-9 项目安全难题公示 (未通过)
PSR-10 项目安全上报方法 (未通过)
PSR-11 容器接口
PSR-12 编码规范化扩充
PSR-13 超媒体链接
PSR-14 事件分发器 (未通过)
PSR-15 HTTP 请求处理器
PSR-16 缓存接口
其实现在很多网站已经挂出 PSR-2 编码规范化的表明了,所推荐看下面这个:
https://laravel-china.org/docs/psr/psr-2-coding-style-guide/1606
但我在实际采用时,除了能够按照上面说的规范化来,还有一块重要的内容他们没提。
文件和类注释主要包含以上内容块:文件表明、PHP 版本号、还有就是按顺序的这五要素:(category, package, author, license, link),而且这五要素排版要对齐哦,一般人我不告诉哦~~~
方法注释主要包含:方法表明、空一行、参数块 (类型、参数名、涵义 —— 这个需要对齐)、空一行、最后return类型。
安装 phpcs采用 phpcs 以后,还是需要先知道这个东西是什么吧?
PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.
摘自:https://github.com/squizlabs/PHP_CodeSniffer
主要包含两个远距工具:phpcs 和 phpcbf (这个之后再说)。phpcs 主要对PHP、JavaScript、CSS文件定义了一系列标识符规范化国际标准,如他们会采用的,也是 Laravel 采用的PHPPSR-2国际标准,能够检测出不符合他们定义的标识符规范化的标识符,并发出警告和错误,当然他们也可以设置报错的级别。
对于 phpcs 的采用,主要有两个途径:
在邻近地区合作开发过程中,动态对他们的标识符进行检测,让标识符提交版本库时,就已经符合要求化国际标准了;
在服务器对提交的标识符进行检测,如果不符合标准的,则不入标识符库,打回要求修改。
下面他们已经开始说说根据不同方法,怎样安装 phpcs 远距工具的。
composercomposer global require “squizlabs/php_codesniffer”写 Laravel 标识符的同学,对采用 composer 应该很熟悉了,这种方法比较推崇。但主要区分为是「全局安装」还是按「项目安装」。
这里我本人所推荐采用「全局安装」,可以在各个 IDE 上直接填入全局安装的 phpcs 可执行路径。但如果你的版本库是采用「git」的话,那我所推荐采用「项目安装」,下文就知道原因了。
注:我采用这种方式「全局安装」后,发现每回都关联不了「VSCode」,这个原因待查。
安装 pear
curl -O https://pear.php.net/go-pear.phar
php -d detect_unicode=0go-pear.phar
已经开始安装配置,
先选择 1 (change the Installation Base);
输入:/usr/local/pear,
再选择 4 (change the Binaries directory),
输入:/usr/local/bin
已经开始安装PHP_CodeSniffer
pear install PHP_CodeSniffer
在 MacOS 系统下:
在 Centos Linux 系统下安装效果:
此方法比较有效率果,而且也符合在多系统上尝试,比如本人同时在「Mac」和 「Linux」下都可以正常安装和采用。
注:我没在「Windows」环境下尝试,尚未知道效果。
brewbrew install php-code-sniffer
这种方法显然在「Mac」系统下有效率了!
当然根据官网的文档,还有其他方法,欢迎我们去尝试:
具体可参考:https://github.com/squizlabs/PHP_CodeSniffer中的「Installation」部分。
采用 phpcs无论是邻近地区还是服务器,只要他们安装好了,自然就可以已经开始采用了。最直观也是最单纯的方法莫过于用命令行的方式了,如:
phpcs php_path
// or
phpcs php_dir
但想到他们是用 IDE 写标识符的,而且是希望动态看到效果的,所以下面尝试在两个 IDE 下看看怎样采用。
安装 VSCode 应用程序在应用程序界面,搜索:phpcs,安装即可。
参考:https://marketplace.visualstudio.com/items?itemName=ikappas.phpcs
配置应用程序
由于项目采用的是系统的 phpcs,所以需要在user setting中配置可执行路径和自己自定义的编写风格
这时候他们去看看他们的标识符界面,是不是有了phpcs的提示信息了:
直接看图,不需要做过多的表明了。
基本上到此,phpcs 的应用程序就可以采用了。
版本检测规范化他们希望在团队项目标识符提交版本库以后「pre-commit」就能检测
版本库的标识符文件,然后再利用「phpcs」去检测每一文件是否符合要求化。svn由于每一 svn 在服务端都有对应 hooks 文件夹,可以在「pre-commit」时,验证标识符的规范化,直接上文件,比较好理解:
#!/bin/bash
LOG=“/tmp/svn.log”touch ${LOG}REPOS=“$1“TXN=“$2“echo “REPOS: $REPOS“ > ${LOG}echo “TXN: $TXN“ >> ${LOG}SVNLOOK=“/usr/bin/svnlook”PHPCS=“/usr/bin/phpcs”# php file extensionPHP_EXT=“php”MSG_MIN_CHAR_NUM=3MAX_PNG_SIZE=2048PROHIBITED_FILES=(
)
TMP_DIR=“/tmp/svn”if [[ -d ${TMP_DIR} ]]; then rm -r ${TMP_DIR}fimkdir -p ${TMP_DIR}functioncheck_php_syntax {
local php_file=$1echo `${PHPCS} ${php_file} 2>&1`
}
functioncreate_file {
local file_name=$1# Create tmp file and copy contenttmp_file=“${TMP_DIR}/${file_name}“mkdir -p“$(dirname “${tmp_file}”)“ && touch “${tmp_file}“${SVNLOOK} cat -t “${TXN}“ “${REPOS}“ “${file_name}“ > ${tmp_file}}
changed_info_str=`${SVNLOOK} changed -t “${TXN}“ “${REPOS}“`
IFS=$\n read -rd -achanged_infos <<<“${changed_info_str}“php_error_msg=“”for changed_info in “${changed_infos[@]}“; do # Prevent commiting file that contains space in its filename echo ${changed_info} >> ${LOG} operation=`echo ${changed_info}| awk{print $1}`
if [[ ${operation} = “A” ]] && [[ `echo ${changed_info} | awk {print NF}` -gt 2 ]]; then echo “Please do not commit file that contains space in its filename!” 1>&2 exit 1 fi file_name=`echo ${changed_info}| awk{print $2}`
echo “operation: ${operation}, file: ${file_name}, ext: ${ext}“ >> ${LOG} # Check prohibit-commit files for prohibited_file in ${PROHIBITED_FILES[@]}; do if [[ ${file_name} = ${prohibited_file} ]]; then echo “${file_name} is not allowed to be changed!” 1>&2 exit 1 fi done ext=`echo ${file_name} | awk -F“.” {print $NF}`
if [[ ${operation} = “U” ]] || [[ ${operation} = “A” ]]; then tmp_file=“${TMP_DIR}/${file_name}“ # Check lua syntax if [[ ${ext} = ${PHP_EXT} ]]; then echo “Check syntax of ${tmp_file}“ >> ${LOG} create_file ${file_name}error_msg=`check_php_syntax${tmp_file}`
if [[ `echo ${error_msg} | sed s/\n//g` != “” ]]; then php_error_msg=“${php_error_msg}\n${error_msg}“ fi fi fidonerm -r ${TMP_DIR}if [[ ${php_error_msg} != “” ]]; then echo “php error:${php_error_msg}“ >> ${LOG} echo “Please fix the error in your php program:${php_error_msg}“ 1>&2 exit 1fiexit 0这就是他们想要看到的效果了,无论 IDE 的动态提示信息,还是提交标识符时的检测反馈,单厢告诉他们哪里格式不符合要求化了。
git这里主要参考 WickedReports/phpcs-pre-commit-hookhttps://github.com/WickedReports/phpcs-pre-commit-hook的写法:
#!/bin/sh
PROJECT=`php -r “echo dirname(dirname(dirname(realpath($0))));”`
STAGED_FILES_CMD=`git diff –cached –name-only –diff-filter=ACMR HEAD | grep \\\\.php`
# Determine if a file list is passedif [ “$#“ -eq 1]
then oIFS=$IFSIFS=
SFILES=“$1“ IFS=$oIFSfiSFILES=${SFILES:-$STAGED_FILES_CMD}echo “Checking PHP Lint…”for FILE in $SFILESdo php -l -ddisplay_errors=0 $PROJECT/$FILE if [ $? != 0]
then echo “Fix the error before commit.” exit 1 fi FILES=“$FILES$PROJECT/$FILE“doneif [ “$FILES“ != “”]
then echo “Running Code Sniffer. Code standard PSR2.” /usr/local/bin/phpcs –standard=PSR2 –colors –encoding=utf-8 -n -p $FILES if [ $? != 0]
then echo “Fix the error before commit!” echo “Run” echo ” ./vendor/bin/phpcbf –standard=PSR2 $FILES“ echo “for automatic fix or fix it manually.” exit 1 fifiexit$?
他们把该文件内容写入「.git/hooks/pre-commit」中,然后再提交两个文件,看看运行效果。
在实验以后,他们先调用邻近地区的phpcs应用程序,看看他们的两个文件标识符的规范化情况:
phpcs –standard=PSR2 –encoding=utf-8-n -p app/Http/Controllers/ApplyController.php
运行结果提示信息:
E 1 / 1 (100%)
FILE: /Users/app/Http/Controllers/ApplyController.php
——————————————————————————————————
FOUND 4 ERRORS AFFECTING 3LINES
——————————————————————————————————
17| ERROR | [x] Opening brace should be on a new line
60| ERROR | [x] Opening parenthesis of a multi-linefunctioncall must be the last content on the
| | line
62 | ERROR | [x] Multi-line functioncall not indented correctly; expected12 spaces but found 16 62| ERROR | [x] Closing parenthesis of a multi-linefunctioncall must be on a line by itself
——————————————————————————————————
PHPCBF CAN FIX THE 4MARKED SNIFF VIOLATIONS AUTOMATICALLY
——————————————————————————————————
Time: 87ms; Memory: 6Mb
主要报错在于:
60 行:output函数
和17 行:
好了,他们执行git commit试试:
接着他们把这两个不规范化的地方改了之后,同样运行邻近地区方法,返回结果:
phpcs –standard=PSR2 –encoding=utf-8-n -p app/Http/Controllers/ApplyController.php
. 1 / 1 (100%)
Time: 44ms; Memory: 6Mb
他们再执行git commit试试:
完美了!
注:「svn」和「git」的区别在于,svn 是放在服务器上做「pre-commit」检测的,而「git」是在邻近地区本项目中的,这也是上文说的,如果你用 git 做版本库,所推荐你用「composer」项目安装的方式安装远距工具。
总结责任编辑以邻近地区 Mac 系统和服务器 Linux 系统为安装端,以 VSCode 和 PHPStorm 两大主流 IDE 作为采用端,以 svn 和 git 为版本库为例,较为完整而又系统流程的说一说「phpcs」的采用,希望对我们有所帮助!
最后留个小难题:如果你采用 Docker 和 git,怎么做这一流程式检测?
责任编辑转载自 叶梅树,如需转载,请向原作者发出申请,原作名称《所推荐这款 phpcs 应用程序规范化 Laravel 标识符 (规范化从邻近地区写标识符到管理远距工具)》
所推荐阅读
2018年5月新书书单(文末福利)
每晚与你撷取IT好文。
在“触发器书刊”,即可免费获得2000门在线视频课程;