X

Utiliser PHP-CS-Fixer pour réparer votre code PHP


Chaque fois que quelqu’un mentionne Confomo, je suis inspiré pour y travailler pendant un jour ou deux. Et puis j’ai laissé couler. Et puis je l’oublie pendant des semaines.

Cette fois-ci, j’ai décidé de le nettoyer un peu selon mes normes de codage les plus récentes. J’ai été sur un coup de pied PSR-2 ces derniers temps, alors j’ai pensé pourquoi ne pas enfin essayer PHP-CS-Fixer de fabpot.

Remarque : J’ai écrit ce message vendredi, et je commençais juste à le modifier et à le publier aujourd’hui – puis j’ai vu qu’il atteignait la version 1.0 aujourd’hui. Excellent timing !

Installation de PHP-CS-Fixer

Vous pouvez utiliser Composer’s global require pour installer php-cs-fixer :

$ composer global require fabpot/php-cs-fixer @stable

Assurez-vous que la corbeille de votre fournisseur Composer se trouve dans votre chemin (dans .bash_profile ou .zsh_profile ou peu importe):

export PATH="$PATH:$HOME/.composer/vendor/bin"

Si vous utilisez un Mac, vous pouvez aussi simplement l’installer avec Homebrew :

$ brew tap josegonzalez/homebrew-php
$ brew install php-cs-fixer

Consultez la page Github pour obtenir des instructions d’installation complètes pour ces méthodes et d’autres.

Exécution de PHP-CS-Fixer

Par défaut, il exécute “tous les fixateurs PSR-2 et quelques autres”. Vous pouvez basculer le niveau que vous souhaitez exécuter avec le --level drapeau, que je vais régler sur psr2 pour que les vérifications “supplémentaires”, qui visent Symfony et vont au-delà de PSR2, ne me découragent pas. (Il exécute la pile entière par défaut, qui s’appelle le niveau “symfony” et inclut des choses comme “Aligner les signes égaux dans les lignes suivantes”).

Essayons-le ! Nous allons d’abord faire un essai sans changement pour voir quels fichiers cela va changer :

$ cd Sites/confomo
$ php-cs-fixer fix ./ --level=psr2 --dry-run

… et le résultat :

   1) app/commands/GrabTwitterProfilePicsCommand.php
   2) app/config/app.php
   3) app/config/auth.php
   (... and more, trimmed for blog post)
Fixed all files in 14.968 seconds, 5.250 MB memory used

On dirait à peu près tout. Notez que cela ne me montre pas quoi changera, mais juste une liste de quels fichiers changera. OK allons-y:

$ php-cs-fixer fix ./ --level=psr2

Ahh… le son doux et doux de milliers d’onglets convertis en espaces. Eh bien, la plupart d’entre eux. Il y a pas mal de types de fichiers et de structures que PHP-CS-Fixer a eu un peu de mal à analyser, donc j’ai dû quand même y aller et faire un peu de nettoyage manuel par la suite – mais cela a commencé le travail pour moi.

Enregistrement de la configuration

Comme tout bon outil, PHP-CS-Fixer a un dotfile pour la configuration. Ce sera un fichier nommé .php_cs c’est en fait un fichier PHP, une instance de SymfonyCSConfigInterface. Découvrez cet exemple dans la documentation :

<?php

$finder = Symfony\CS\Finder\DefaultFinder::create()
    ->exclude('somedir')
    ->in(__DIR__)
;

return Symfony\CS\Config\Config::create()
    ->fixers(array('indentation', 'elseif'))
    ->finder($finder)
;

Vous pouvez configurer les niveaux, les “fixers”, les fichiers et les répertoires que vous souhaitez analyser via ce fichier.

Conclure

C’est ça!

Choisissez votre méthode d’installation préférée, choisissez votre niveau de reniflement, faites un essai pour voir quels fichiers il va réparer, exécutez-le, réjouissez-vous et lisez la documentation pour plus d’options de configuration.

Des questions? Commentaires? Rejoignez-moi sur Twitter à @stauffermatt.

Post-scriptum

J’étais curieux de savoir quelle quantité de PSR-2 a vraiment été implémentée à la suite de la bascule PSR-2 de PHP-CS-Fixer. J’aurais pu lire les vérifications, mais à la place, j’ai créé le script le plus moche, le plus non conforme à psr-1 et non-psr-2 possible, et je l’ai exécuté.

<?php

use Exception, Awesome;
namespace Awesome\Stuff;
class bad_class
    extends \Exception{
    const camelCase="abc";
    public $awesome="unvisible"; public $_great="fabulous";

    function Do_something_snaked_cased(){
        // This is one really frigging long line. I wonder if PHP-CS-Fixer will trim this really frigging long line? It says no hard limit so I think it won't.

        if( isset ($abc) || TRUE )
        {
            // do stuff


        }



    }

    final static public function woop() {}

    function _invisible( $stuff = [] , $other_stuff ) {
        switch($stuff)
        {
        case 0:
        echo 'stuff';
        break;
        }
    }

}

echo "echo";

?>

Je l’ai exécuté et j’ai obtenu ce qui suit:

<?php

use Exception;
use Awesome;
namespace Awesome\Stuff;

class test
    extends \Exception
{
    const camelCase="abc";
    public $awesome="unvisible";
    public $_great="fabulous";

    public function Do_something_snaked_cased()
    {
        // This is one really frigging long line. I wonder if PHP-CS-Fixer will trim this really frigging long line? It says no hard limit so I think it won't.

        if (isset($abc) || TRUE) {
            // do stuff
        }
    }

    final public static function woop()
    {
    }

    public function _invisible($stuff = [], $other_stuff)
    {
        switch ($stuff) {
        case 0:
        echo 'stuff';
        break;
        }
    }
}

echo "echo";

Comme vous pouvez le voir, cela a nettoyé mon indentation (l’original était des onglets, bien qu’il semble que l’intégrateur de code de mon blog les convertisse en espaces affichés), mon bloc d’utilisation, mon interligne, mon espacement entre accolades, les espaces autour des parenthèses, et la fermeture ?>. Il n’a pas aide avec la casse (camel v upper v studly v snake), les traits de soulignement principaux, l’indentation des commutateurs, les ordres de paramètres, la capitalisation de TRUE/FALSE/NULL, la définition de la classe de ligne fractionnée et probablement quelques autres que je n’ai pas remarqués.

Cela a du sens : il ne peut pas apporter de modifications fondamentales aux propriétés de votre application. Ce n’est pas assez intelligent pour savoir, par exemple, où const camelCase est utilisé, il ne peut donc pas se sentir à l’aise de le changer. Donc PHP-CS-Fixer change les choses qu’il peut changer sans casser votre codece qui est très bien, mais laisse tout le reste seul, ce qui signifie que c’est une bonne première étape, mais vous devez toujours exécuter vos propres renifleurs en même temps.

Pour une vraie réponse et non pour ce faux mythe que je fais, consultez la page Github pour une liste de tous les fixateurs que PHP-CS-Fixer met à disposition.