Hier, je fais du ménage sur mon Mac, en particulier je vire ce vieux PHP 5.6 qui traine là depuis des lustres et hop j’ai réussi à casser l’extension SublimeText qui me servait jusqu’alors à formater le code PHP — essentiellement, mais aussi le code Javascript —, CodeFormatter.
Pour Javascript, pas de souci, j’ai une extension jsPrettier qui fonctionne très bien, pas besoin de plus. Pour PHP j’ai choisi, plutôt que d’essayer de refaire tourner CodeFormatter, d’utiliser PHP CS Fixer qui fait aussi bien le job que CodeFormatter une fois correctement configuré.
J’ai poussé sur les dépôts Dotclear et Clearbricks une première version de ce fichier de configuration, qui pourra être amené à évoluer au fur et à mesure de mes/nos besoins/envies.
Je reprends ce fichier ci-dessous :
<?php
// Adapted from https://gist.github.com/codfish/c77d348820c1c6b4ebe4a66dc2291c74
/**
* Rules we follow are from PSR-2 as well as the rectified PSR-2 guide.
*
* - https://github.com/FriendsOfPHP/PHP-CS-Fixer
* - https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
* - https://github.com/php-fig-rectified/fig-rectified-standards/blob/master/PSR-2-R-coding-style-guide-additions.md
*
* If something isn't addressed in either of those, some other common community rules are
* used that might not be addressed explicitly in PSR-2 in order to improve code quality
* (so that devs don't need to comment on them in Code Reviews).
*
* For instance: removing trailing white space, removing extra line breaks where
* they're not needed (back to back, beginning or end of function/class, etc.),
* adding trailing commas in the last line of an array, etc.
*/
$finder = PhpCsFixer\Finder::create()
->exclude('node_modules')
->exclude('vendor')
->in(__DIR__);
return PhpCsFixer\Config::create()
->setRules([
'@PSR2' => true,
'array_indentation' => true,
'array_syntax' => [ 'syntax' => 'short' ],
'binary_operator_spaces' => [ 'default' => 'align_single_space_minimal'],
'blank_line_before_statement' => true,
'braces' => [ 'allow_single_line_closure' => true ],
'cast_spaces' => true,
'combine_consecutive_unsets' => true,
'concat_space' => [ 'spacing' => 'one' ],
'linebreak_after_opening_tag' => true,
'method_argument_space' => ['ensure_fully_multiline' => false],
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_break_comment' => false,
'no_extra_consecutive_blank_lines' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_whitespace_in_blank_line' => true,
'no_spaces_around_offset' => true,
'no_unused_imports' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'no_whitespace_before_comma_in_array' => true,
'normalize_index_brace' => true,
'phpdoc_indent' => true,
'phpdoc_to_comment' => true,
'phpdoc_trim' => true,
'single_quote' => true,
'return_type_declaration' => ['space_before' => 'none'],
'ternary_to_null_coalescing' => true,
'trailing_comma_in_multiline_array' => false,
'trim_array_spaces' => true,
])
->setFinder($finder);
Si vous voulez des détails sur les options et leurs valeurs possible, je vous conseille un coup d’œil sur ce site (en anglais) qui les explique et les illustre.
Et la doc officielle des règles utilisables dans la configuration.
Tiens, ça serait pas bête que je trie les dernières lignes d’option… À faire la prochaine fois.
1 De Nicolas -
Je pense que l’ensemble des règles que tu présentes sont celles que tu aimerais suivre car si tu essaies de les appliquer sur le code actuel tu vas avoir un commit de taille monstrueuse !
J’aimerais aussi arriver à quelque chose de similaire mais pour le moment, je n’active que certaines règles (pas PSR2 par exemple). Et je ne fais un “fix” que sur les fichiers modifiés avec un hook pre-commit.
Sinon, la directive allow_single_line_closure n’est pas à la racine mais dans une directive braces :
php 'braces' => [ 'allow_single_line_closure' => true, ],
2 De Franck -
Ah oui merci pour la typo, je m’en occupe :-)
Sinon oui je formate à l’occasion d’un commit et uniquement sur les fichiers modifiés.
3 De Franck -
En fait de typo, quand je mets
braces
ça ne fonctionne pas, je reviens à la config initiale du coup.4 De Franck -
En fait c’est très merdique, plus moyen de lui faire prendre en compte cette option :
allow_single_line_closure
.5 De Franck -
Et hop, un ticket ouvert…
6 De Franck -
Et une réponse où j’apprends que le cas où je souhaitais que ça s’applique n’est pas prévu par cette option.
7 De Nicolas -
Le cas que tu présentes n’est pas prévu car ce n’est pas une fonction anonyme (closure)