PHPStorm 儲存時自動執行 PHP CS Fixer

MArtian發表於2022-12-17

在我們日常開發中,一定少不了 PHP CS Fixer 來幫我們統一程式碼風格,但是PHP CS Fixer 不像 ESLint 一樣,可以在 PHPStorm 中在儲存時自動執行。

PHPStorm 儲存時自動執行 PHP CS Fixer

PHPStorm 並沒有為我們提供可執行 PHP CS Fixer 的選項,「重新格式化程式碼」大部分時都不能滿足我們的需求。


為此我們需要在 PHPStorm 中新增一個 「File Watcher」來自動執行程式碼格式化。

  1. 首先全域性安裝 PHP CS Fixer
    composer global require friendsofphp/php-cs-fixer
  2. 執行
    php-cs-fixer

PHPStorm 儲存時自動執行 PHP CS Fixer

代表安裝成功了,如果提示命令未找到,那麼你需要將全域性 composer vendor 目錄新增到全域性變數,我用的是 zsh,這裡改成你自己的。

echo 'export PATH="$HOME/.composer/vendor/bin:$PATH"' >> ~/.zshrc
  1. 開啟 PHPStorm,新增自定義檔案
    PHPStorm 儲存時自動執行 PHP CS Fixer
    程式檔案地址,命令列輸入,並填入
    which php-cs-fixer
    PHPStorm 儲存時自動執行 PHP CS Fixer
    引數欄:
    fix $FileDir$/$FileName$

到這就搞定了,現在每當我們儲存時就會自動執行 php-cs-fixer,現在還有一個問題,是可能每個專案有不同的 .php-cs.dist 格式化配置檔案,以上的配置是使用了全域性 php-cs-fixer 配置檔案,如果要使用單獨的配置檔案,需要修改配置如下:

fix --config=$ProjectFileDir$/.php-cs.dist $FileDir$/$FileName$

.php-cs.dist 通常放在專案根目錄。

最後附上 .php-cs.dist 配置檔案

<?php
$header = <<<'EOF'

EOF;

$finder =  PhpCsFixer\Finder::create()
            ->exclude('tests/Fixtures')   //排除檔案
            ->in(__DIR__);

return PhpCsFixer\Config::create()
    ->setRiskyAllowed(true)
    ->setRules([
        '@PSR2'                                 => true,
        '@Symfony:risky'                        => true,
        'array_syntax'                          => ['syntax' => 'short'],
        'combine_consecutive_unsets'            => true,   //多個unset,合併成一個
        // one should use PHPUnit methods to set up expected exception instead of annotations
        'general_phpdoc_annotation_remove'      => ['expectedException', 'expectedExceptionMessage', 'expectedExceptionMessageRegExp'], //phpdocs中應該省略已經配置的註釋
        //'header_comment'                        => array('header' => $header), //新增,替換或者刪除 header 註釋。
        'heredoc_to_nowdoc'                     => true,     //刪除配置中多餘的空行和/或者空行。
        'no_extra_consecutive_blank_lines'      => ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'],
        'no_unreachable_default_argument_value' => false, //在函式引數中,不能有預設值在非預設值之前的引數。有風險
        'no_useless_else'                       => true,  //刪除無用的eles
        'no_useless_return'                     => true,  //刪除函式末尾無用的return
        'no_empty_phpdoc'                       => true,  // 刪除空註釋
        'no_empty_statement'                    => true,  //刪除多餘的分號
        'no_leading_namespace_whitespace'       => true,  //刪除namespace宣告行包含前導空格
        'no_spaces_inside_parenthesis'          => true,  //刪除括號後內兩端的空格
        'no_trailing_whitespace'                => true,  //刪除非空白行末尾的空白
        'no_unused_imports'                     => true,  //刪除未使用的use語句
        'no_whitespace_before_comma_in_array'   => true,  //刪除陣列宣告中,每個逗號前的空格
        'no_whitespace_in_blank_line'           => true,  //刪除空白行末尾的空白
        'ordered_class_elements'                => false, //class elements排序
        'ordered_imports'                       => false, // use 排序
        'phpdoc_add_missing_param_annotation'   => true,   //新增缺少的 Phpdoc @param引數
        'phpdoc_trim'                           => true,
        //   'phpdoc_trim_consecutive_blank_line_separation' => true, //刪除在摘要之後和PHPDoc中的描述之後,多餘的空行。
        'phpdoc_order'                          => true,
        'psr4'                                  => true,
        // 'strict_comparison'                     => true,   //嚴格比較,會修改程式碼有風險
        //'strict_param'                          => true,
        'ternary_operator_spaces'               => true,  //標準化三元運算的格式
        'ternary_to_null_coalescing'            => true,  //儘可能使用null合併運算子??。需要PHP> = 7.0。
        'whitespace_after_comma_in_array'       => true, // 在陣列宣告中,每個逗號後必須有一個空格
        'trim_array_spaces'                     => true,  //刪除陣列首或尾隨單行空格
        'align_multiline_comment'               => [                   //每行多行 DocComments 必須有一個星號(PSR-5),並且必須與第一行對齊。
            'comment_type' => 'phpdocs_only'
        ],
        'array_indentation'                 => true,  //陣列的每個元素必須縮排一次
    ])
    ->setFinder($finder);
本作品採用《CC 協議》,轉載必須註明作者和本文連結
我從未見過一個早起、勤奮、謹慎,誠實的人抱怨命運。

相關文章