web-dev-qa-db-fra.com

Comment ignorer certaines erreurs standard de codage dans PHP CodeSniffer

Nous avons une application Web PHP 5 et nous évaluons actuellement PHP CodeSniffer afin de décider si le forçage des normes de code améliore la qualité du code sans causer trop de maux de tête. Si cela vous semble judicieux, nous ajouterons un hook de pré-validation SVN pour nous assurer que tous les nouveaux fichiers validés sur la branche dev sont exempts d'odeurs standard.

Existe-t-il un moyen de configurer PHP codeSniffer pour ignorer un type d'erreur particulier? ou le faire traiter une certaine erreur comme un avertissement?

Voici un exemple pour démontrer le problème:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div>
    <?php
    echo getTabContent('Programming', 1, $numX, $numY);

    if (isset($msg)) {
        echo $msg;
    }
    ?>
</div>
</body>
</html>

Et voici le résultat de PHP_CodeSniffer:

> phpcs test.php 
 
 ------------------------------ -------------------------------------------------- 
 TROUVÉ 2 ERREUR (S) ET 1 AVERTISSEMENT (S) AFFECTANT 3 LIGNE (S) 
 ---------------------- -------------------------------------------------- -------- 
 1 | AVERTISSEMENT La ligne dépasse 85 caractères. contient 121 caractères 
 9 | ERREUR | Fichier manquant doc commentaire 
 11 | ERREUR | Ligne indentée de manière incorrecte; 0 espace attendu, trouvé 4 
 ------------------------------------------- ----------------------------------------- 

J'ai un problème avec l'erreur " Line indentée de manière incorrecte ". Je suppose que cela se produit car je mélange l'indentation PHP avec l'indentation HTML. Mais cela le rend plus lisible, n'est-ce pas? ( en tenant compte du fait que je n'ai pas les ressources pour passer à un framework MVC pour le moment ). Donc, je voudrais l'ignorer s'il vous plaît.

13
Tom

J'ai trouvé une solution pour supprimer l'erreur " Ligne indentée de manière incorrecte " mais je devrais d'abord dire que dragonmantank a un excellent point - vous ne devrait pas mélanger PHP et HTML. C'est une recette pour les maux de tête. Cependant, malheureusement, je pense que mélanger PHP et HTML est très courant, en particulier dans les logiciels hérités.

Le correctif le plus rapide et le plus sale en supposant que nous utilisions les normes de codage phpcs par défaut (qui sont les normes PEAR ) consiste à supprimer le fichier Sniff approprié. Trouvez l'emplacement des normes PEAR, pour moi en utilisant bunt , c'était ici:

> cd /usr/share/php/PHP/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace

Renommez le fichier ScopeIndentSniff.php afin que le sniff qui vérifie l'indentation du code ne soit plus exécuté:

> Sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Travail effectué - l'indentation ne sera plus vérifiée et l'erreur " ligne indentée de manière incorrecte " ne se produira pas ( et votre code ne sera ni standard ni d'une telle qualité! ).


La solution ci-dessus est assez amateur. La solution la plus propre consiste à créer une nouvelle norme de codage qui utilise toutes les normes PEAR à l'exception de vos personnalisations. C'est très rapide à faire. Voici comment faire en utilisant getIncludedSniffs() et getExcludedSniffs() et quelques conventions de dénomination phpcs:

Go to the directory where the phpcs coding standards are defined:
> cd /usr/share/php/PHP/CodeSniffer/Standards

Create a new directory for your new standard:
> Sudo mkdir PEARish
> cd PEARish

Create your new standard by saving the following in the file:
> Sudo emacs PEARishCodingStandard.php
<?php
class PHP_CodeSniffer_Standards_PEARish_PEARishCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard
{
    public function getIncludedSniffs()
    {
      return array('PEAR');
    }

    public function getExcludedSniffs()
    {
      return array('PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php');
    }
}
?>

Testez votre nouvelle norme de codage personnalisée en appelant phpcs à l'aide de l'indicateur --standard. Par exemple:

> phpcs --standard=PEARish Test.php

Une fois que cela fonctionne, vous pouvez définir votre nouvelle norme comme valeur par défaut, ce qui signifie que vous n'avez pas besoin de taper l'indicateur --standard à chaque fois que vous utilisez phpcs:

> Sudo phpcs --config-set default_standard PEARish

Voir le manuel phpcs pour plus d'informations.

11
Tom

Vous allez rencontrer beaucoup de problèmes sous PHPCS avec votre code PHP mélangé à HTML. PHPCS n'est vraiment utile que lorsque vous analysez des scripts purs PHP. Les normes de codage intégrées sont construites autour de PHP pur, pas de mélange PHP/HTML.

Une option serait de créer votre propre standard personnalisé et de l'utiliser à la place. La norme personnalisée prendrait en compte le mélange de code, mais il serait probablement pénible d’écrire.

L'autre option consiste à utiliser un système de modèles puisque vous avez dit que vous ne voulez pas passer à un framework. Smarty et Twig peuvent tous deux être utilisés en dehors d'un cadre MVC. Déplacez-vous vers l'un de ceux-ci et laissez ensuite PHPCS analyser uniquement les fichiers .PHP, et non les fichiers modèles.

7
dragonmantank