PHPStorm如何配置PHP-Code-Sniffer和PHP-CS-Fixer让PHP代码支持PSR2规范

phpcs

PHP Code Snifferopen in new window 简称 phpcs ,用来检查PHP代码是否符合PSR-2,若完全符合则没有任何结果,若有任何错误将显示错误报告。

安装

使用Composer命令进行全局安装phpcsopen in new window

composer global require 'squizlabs/php_codesniffer=*'

测试

phpcs --version

输出如下提示

PHP_CodeSniffer version 3.2.3 (stable) by Squiz (http://www.squiz.net)

检查PSR-2命令行

phpcs --standard=PSR2 laravel/app
  • 命令中laravel为项目名称,因为代码都在app目录下,所以直接指定PHP Code Sniffer检查app目录下所有的.php文件。

  • --standard=PSR2 PHP Code Sniffer预设的coding style为PEAR。

输出类似如下的内容:

FILE: /Volumes/codes/Desktop_Temp/201801/laravel/laravel-model-observers/app/Observers/PostObserver.php
-------------------------------------------------------------------------------------------------------
FOUND 9 ERRORS AFFECTING 9 LINES
-------------------------------------------------------------------------------------------------------
  7 | ERROR | [x] Opening brace should be on a new line
 12 | ERROR | [x] Opening brace should be on a new line
 16 | ERROR | [x] Opening brace should be on a new line
 20 | ERROR | [x] Opening brace should be on a new line
 25 | ERROR | [x] Opening brace should be on a new line
 29 | ERROR | [x] Opening brace should be on a new line
 33 | ERROR | [x] Opening brace should be on a new line
 38 | ERROR | [x] Opening brace should be on a new line
 52 | ERROR | [x] Expected 1 newline at end of file; 0 found
-------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 9 MARKED SNIFF VIOLATIONS AUTOMATICALLY
-------------------------------------------------------------------------------------------------------

Time: 104ms; Memory: 6Mb

若没有任何违反PSR-2之处,将没有任何回应,否则将出現类似如上的输出信息,告知用户那个文件有问题,错在哪些地方。其中FOUND为行数。

至此,phpcs安装完毕。

php-cs-fixer

PHP Coding Standards Fixeropen in new window 简称 php-cs-fixer。虽然PHP Code Sniffer可以找出哪些代码不符合PSR-2。

如果只有几个文件,那么手动修改就可以,若文件太多,就得依赖 php-cs-fixer 帮助修正。

安裝

使用Composer命令进行全局安装 PHP-CS-Fixeropen in new window

composer global require friendsofphp/php-cs-fixer

测试

php-cs-fixer  --version

输出如下提示

PHP CS Fixer 2.12.0 Long Journey by Fabien Potencier and Dariusz Ruminski

修正PSR-2命令行

php-cs-fixer fix laravel/app/ --rules=@PSR2 --verbose
  • laravel为项目名称,因为我们写的代码都在app目录下,所以直接指定PHP-CS-Fixer帮我们检查app目录下所有的.php文件。

  • --rules=@PSR2指定使用PSR-2标准来修正代码。

  • --verbose表示PHP-CS-Fixer在执行时会显示出详细的结果。

输出类似如下的内容:

SSSSSSSSSSSSSFSSSSSSS
Legend: ?-unknown, I-invalid file syntax, file ignored, S-Skipped, .-no changes, F-fixed, E-error
   1) app/Observers/PostObserver.php (braces, single_blank_line_at_eof)

Fixed all files in 0.015 seconds, 10.000 MB memory used
  • Lengend表示在执行时,所执行过的动作。

  • 如上图所示,表示修正过PostObserver.php

PhpStorm

PhpStorm对于PSR-2有以下支持:

  • 內建支持PSR-2语法。
  • 可安装PHP Code Sniffer插件,提醒开发者所写代码是否符合PSR-2。
  • 可安装PHP Coding Standards Fixer插件,将代码修正为PSR-2。

内建支持PSR-2语法

Preferences -> Editor -> Code Style -> PHP : Set from… -> Predefined Style -> PSR1/PSR2

PSR-2 所没规定的 Code Style 如下图所示,可能会希望 array 的 key 与 value 能对齐,但这病不是 PSR-2 所规定的style,开发者可以根据需要自行设定。

phpcs

Preferences -> Languages & Frameworks -> PHP -> Code Sniffer

指定 phpcs 路徑 : /Users/xiaoluo/.composer/vendor/bin/phpcs,其中/Users/xiaoluo/为当前电脑的家目录。

Preferences -> Editor -> Inspections

  • PHP Code Sniffer validation选项打勾。

  • Coding standardPSR2

至此,phpStorm的phpcs配置完毕。

php-cs-fixer

Preferences -> Tools -> External Tools

+新增External Tools

在模板中添加如下内容:

  • Name : php-cs-fixer

  • Description : A tool to automatically fix PHP coding.

  • Program : /Users/xiaoluo/.composer/vendor/bin/php-cs-fixer,其中/Users/xiaoluo/为当前用户的家目录。

  • Parameters : --verbose fix $FileDir$/$FileName$ --config=/Users/xiaoluo/.phpcsfixer,其中/Users/xiaoluo/为当前用户的家目录。

  • Working Directory : $ProjectFileDir$

上述文件中包含一个php-cs-fixer的配置文件,/Users/xiaoluo/.phpcsfixer内容如下:

<?php
$finder = PhpCsFixer\Finder::create()
          ->exclude('tests/')
          ->in(__DIR__)
;

return PhpCsFixer\Config::create()
    ->setRules([
        '@PSR2' => true,
        'align_multiline_comment' => true,
        'no_trailing_whitespace' => true,
        'no_short_echo_tag'=> true,
        'array_syntax' => ['syntax' => 'short'],
        'no_unused_imports' => true,
        'ordered_imports' => ['sortAlgorithm' => 'length']
    ])
    ->setFinder($finder)
;

添加快捷键

Preferences -> keymap -> 搜索php-cs-fixer -> 右键点击Add Keyboard Shortcut

测试

测试phpstorm自带的Reformat Code

  • ⌃ + ⌥ + L : 重新整理Coding Style。

  • ⌃ + ⌥ + ⇧+ L : 设定重新整理Coding Style方式。

添加完以后快捷键为:

一些简单的格式化设置

使用命令Command + Shift + a后输入:'Show Reformat File Dialog'关键字,后看到下面的配置

  • Optimize imports : 没用到的namespace,use会自动移除。

  • Rearrange code : 会自动依据Code Style的Arrangement规格将代码重新排序。