Laravel 5.5 の StyleCI 設定を PHP-CS-Fixer で表現しようとしたもの
.php_cs.dist
<?php
/*
* This document has been generated with
* https://mlocati.github.io/php-cs-fixer-configurator/?version=2.15#configurator
* you can change this configuration by importing this file.
*/
return PhpCsFixer\Config::create()
->setRiskyAllowed(true)
->setRules([
'align_multiline_comment' => true,
'array_syntax' => ['syntax' => 'short'],
'binary_operator_spaces' => true,
'blank_line_after_namespace' => true,
'blank_line_after_opening_tag' => true,
'blank_line_before_statement' => ['statements' => ['return']],
'braces' => true,
'cast_spaces' => true,
'class_attributes_separation' => ['elements' => ['method']],
'class_definition' => true,
'concat_space' => true,
'declare_equal_normalize' => true,
'elseif' => true,
'encoding' => true,
'full_opening_tag' => true,
'function_declaration' => true,
'function_typehint_space' => true,
'hash_to_slash_comment' => true,
'heredoc_to_nowdoc' => true,
'include' => true,
'increment_style' => ['style' => 'post'],
'indentation_type' => true,
'lowercase_cast' => true,
'lowercase_constants' => true,
'lowercase_keywords' => true,
'magic_constant_casing' => true,
'method_argument_space' => true,
'multiline_whitespace_before_semicolons' => true,
'no_alias_functions' => true,
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_closing_tag' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => ['tokens' => ['extra', 'throw', 'use']],
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_mixed_echo_print' => true,
'no_multiline_whitespace_around_double_arrow' => true,
'no_short_bool_cast' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_spaces_after_function_name' => true,
'no_spaces_around_offset' => true,
'no_spaces_inside_parenthesis' => true,
'no_trailing_comma_in_list_call' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_trailing_whitespace' => true,
'no_trailing_whitespace_in_comment' => true,
'no_unneeded_control_parentheses' => true,
'no_unreachable_default_argument_value' => true,
'no_unused_imports' => true,
'no_useless_return' => true,
'no_whitespace_before_comma_in_array' => true,
'no_whitespace_in_blank_line' => true,
'normalize_index_brace' => true,
'not_operator_with_successor_space' => true,
'object_operator_without_whitespace' => true,
'ordered_imports' => ['sort_algorithm' => 'length'],
'phpdoc_indent' => true,
'phpdoc_inline_tag' => true,
'phpdoc_no_access' => true,
'phpdoc_no_package' => true,
'phpdoc_no_useless_inheritdoc' => true,
'phpdoc_scalar' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_summary' => true,
'phpdoc_to_comment' => true,
'phpdoc_trim' => true,
'phpdoc_types' => true,
'phpdoc_var_without_name' => true,
'psr4' => true,
'self_accessor' => true,
'short_scalar_cast' => true,
'simplified_null_return' => true,
'single_blank_line_at_eof' => true,
'single_blank_line_before_namespace' => true,
'single_class_element_per_statement' => true,
'single_import_per_statement' => true,
'single_line_after_imports' => true,
'single_quote' => true,
'space_after_semicolon' => true,
'standardize_not_equals' => true,
'switch_case_semicolon_to_colon' => true,
'switch_case_space' => true,
'ternary_operator_spaces' => true,
'trailing_comma_in_multiline_array' => true,
'trim_array_spaces' => true,
'unary_operator_spaces' => true,
'visibility_required' => true,
'whitespace_after_comma_in_array' => true,
])
->setFinder(PhpCsFixer\Finder::create()
->exclude('vendor')
->in(__DIR__)
)
;
試行錯誤の記録
Laravel のコーディングスタイルを確認する
[Laravel コーディング規約] で調べますと、
から
へとたどり着きました。これに従えば OK ですね。内容は、
Coding Style Laravel follows the PSR-2 coding standard and the PSR-4 autoloading standard.
ですので、 PSR-2 と PSR-4 の 2 つに従えば OK です。
また、
PHPDoc Note that the @param attribute is followed by two spaces, the argument type, two more spaces, and finally the variable name:
とあり、 PHPDoc の @param 属性の後は 2 スペース、引数の種類、 2 スペース、引数名、という順番にすることがポイントです。
Laravel 5.5 で使われているコード整形ツールを調べる
laravel/framework at 5.5 を確認してみますと、 PHP-CS-Fixer を使っていないようです。
framework/.styleci.yml at 5.5 · laravel/framework というものはありました。これは StyleCI – The Web Coding Style Fixer という整形サービスで使えるようです。
Laravel 5.4 には framework/.php_cs at 5.4 · laravel/framework があるのですけれども。
ということは、 Laravel 5.5 から StyleCI に移行したようです。
そのまま使えたら楽なのになあ、と思っていましたけれども、仕方ありません。
styleci.yml の preset の内容は、次です。
これを再現すれば良いようですね。
実際にやってみる
PHP-CS-Fixer そのものについては、次のページが役立ちます。
1 つ目のページから PHP-CS-Fixer の設定を自動生成することのできるページが案内されていました。
このページを使って、上記のルールを適用し生成しました。
それを、 Laravel 5.5 に対して適用し、 PHP-CS-Fixer を実行したところ、修正されるではありませんか!
ということは、 PSR-2 、 PSR-4 、以外のルールや、これらのルール内だがいくつか選択できる内容が存在するということです。
なのですが、とりあえず、修正されないようにした設定ファイルが次となります。追加したルールは、 ensure_fully_multiline で、メソッド引数が複数行に渡るときには1行に引数一つとする、というものです。
<?php
/*
* This document has been generated with
* https://mlocati.github.io/php-cs-fixer-configurator/?version=2.15#configurator
* you can change this configuration by importing this file.
*/
return PhpCsFixer\Config::create()
->setRules([
'@PSR2' => true,
'method_argument_space' => ['ensure_fully_multiline' => false],
'psr4' => true,
])
->setFinder(PhpCsFixer\Finder::create()
->exclude('vendor')
->in(__DIR__)
)
;
ここで、 StyleCI の Laravel の箇所 を見て、 Laravel のコーディングスタイルが再現できているかどうなのか、全くわからないことに気がつきました。
こちらのルールは、いくつものルールをグループ化したものを記述しているため、見比べられないのです。
StyleCI の Laravel を PHP-CS-Fixer で再現する
そこで、 StyleCI の Laravel の各項目をひとつひとつ内容を把握して、対応する PHP-CS-Fixer のルールを追加していきました。
全く同じ名前のルールもありましたが、名前の異なったルール、カスタマイズの必要なルール、見つからなかったルールなどありましたので、メモします。
凡例
StyleCI の Larave ルール
StyleCI の Larave ルールの補足
- PHP-CS-Fixer ルール
- 非推奨だったので、非推奨ではない PHP-CS-Fixer のルール
以下、該当したルールを挙げます。
blank_line_before_return
- blank_line_before_return this fixer is marked as deprecated! Please use blank_line_before_statement
- blank_line_before_statement
'blank_line_before_statement' => ['statements' => ['return']],
length_ordered_imports
Order import statements by length.
-
ordered_imports
method_separation
Methods MUST be separated with one blank line.
- method_separation
This fixer is marked as deprecated! Please use class_attributes_separation
'class_attributes_separation' => ['elements' => ['method']],
method_visibility_required
'visibility_required' => ['elements' => ['method']],
no_blank_lines_after_throw
- no_extra_blank_lines
'no_extra_blank_lines' => ['tokens' => ['throw']],
no_blank_lines_between_imports
- no_extra_blank_lines
'no_extra_blank_lines' => ['tokens' => ['use']],
no_blank_lines_between_traits
- no_extra_blank_lines
'no_extra_blank_lines' => ['tokens' => ['use_trait']],
no_extra_consecutive_blank_lines
- no_extra_consecutive_blank_lines
- This fixer is marked as deprecated! Please use no_extra_blank_lines
- no_extra_blank_lines
'no_extra_blank_lines' => ['tokens' => ['extra']],
no_multiline_whitespace_before_semicolons
- no_multiline_whitespace_before_semicolons
This fixer is marked as deprecated! Please use multiline_whitespace_before_semicolons
- multiline_whitespace_before_semicolons
no_spaces_inside_offset
There MUST NOT be spaces between the offset square braces and its contained values.
- no_spaces_around_offset デフォルトで角カッコ間と内部のスペースの除去なため、実質同じ。
phpdoc_type_to_var
- 見つからない
post_increment
- increment_style
'increment_style' => ['style' => 'post'],
print_to_echo
- no_mixed_echo_print
property_visibility_required
- visibility_required
'visibility_required' => ['elements' => ['property']],
visibility_required の method もルールに含めるので、単に'visibility_required' => true,
をルールとすれば良い。
short_array_syntax
- array_syntax
'array_syntax' => ['syntax' => 'short'],
unalign_equals
- 見つからない
unix_line_endings
- 見つからない
移植したルールを試してみると。。。
laravel/framework に、完成した本投稿冒頭のルールを適用してみると、修正が出てきてしまいました。
- import 文の順番を、as 移行も含む文字列数の昇順にするよう、修正対象となった。
- 配列のキーと値の開始位置を揃えるよう、修正対象となった。
- 多次元を指定した引数を複数行に渡って記述している箇所を 1 行にするよう、修正対象となった。
return null;
をreturn;
に直すよう、修正対象となった。- 文字列連結のドット前後のスペースを取り除くよう、修正対象となった。
また、作成直後の Laravel プロジェクトに適用した時は次の結果となりました。
- メソッドコメントの行末にドットが付くよう、修正対象となった。
- 使用していない use 文を削除するよう、修正対象となった。
- 配列のキーと値の開始位置を揃えるよう、修正対象となった。
- メソッドコメントのコメントのない行を削除するよう、修正対象となった。
- メソッドコメントの @property の型の表現を int から integer へ変更するよう、修正対象となった。
- 配列の表記を、 array() ではなく [] と変更するよう、修正対象となった。
- 文字列連結のドット前後のスペースを取り除くよう、修正対象となった。
おわりに
うーん、あともう少しと思うのですけれども、なかなか難しいです。
こういうのは、もっとパッと済ませたいのですけれども、うまくいかないものですね。。。
以上です。