Comment ignorer certaines erreurs standard de codage dans PHP CodeSniffer

14

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 semble bon, nous ajouterons un crochet de pré-validation SVN pour nous assurer que tous les nouveaux fichiers validés sur la branche dev ne contiennent pas d'odeurs standard de codage.

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 à la place?

Voici un exemple pour illustrer 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 la sortie de PHP_CodeSniffer:

> phpcs test.php 

-------------------------------------------------- ------------------------------
TROUVE 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 | Commentaire de document de fichier manquant
 11 | ERREUR | Ligne indentée incorrectement; 0 espaces prévus, 4 trouvés
-------------------------------------------------- ------------------------------

J'ai un problème avec l' erreur " Ligne indentée incorrectement ". Je suppose que cela se produit parce que je mélange l'indentation PHP avec l'indentation HTML. Mais cela le rend plus lisible non? ( en tenant compte du fait que je n'ai pas les ressources pour passer à un framework MVC en ce moment ). Je voudrais donc l'ignorer s'il vous plaît.

À M
la source
1
c'est un peu trop une question de programmation IMO pour être ici .. car il s'agit d'un utilitaire de type "LINT" qui intéresserait principalement les programmeurs hard-core, pas nécessairement les webmasters. Mais il est joliment posé et formaté, nous pouvons donc le laisser pour le moment.
Jeff Atwood
2
À propos de l'avertissement de la ligne 1: Puis-je suggérer d'utiliser le DOCTYPE HTML5?
luiscubal
Merci pour vos commentaires Jeff - je suis heureux de le déplacer. J'aurais probablement dû réaliser qu'il n'y avait pas de balise PHP lorsque j'ai créé la question :-).
Tom
@luiscubal - he he, bonne suggestion; comme votre pensée ;-)
Tom

Réponses:

11

J'ai trouvé une solution pour supprimer l' erreur " Ligne indentée incorrectement " mais je dois d'abord dire que dragonmantank a un excellent point - vous ne devez 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 utilisons les phpcsnormes de codage par défaut (qui sont les normes PEAR ) est de supprimer le fichier Sniff correspondant. Trouvez l'emplacement des normes PEAR, pour moi, en utilisant Ubuntu , c'était ici:

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

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

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Travail effectué - maintenant l'indentation ne sera pas vérifiée et l' erreur " Ligne indentée incorrectement " ne se produira pas ( et votre code ne sera pas standard et ne sera pas 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 choisies à la cerise. C'est très rapide à faire. Voici comment le faire en utilisant getIncludedSniffs()et getExcludedSniffs()et quelques phpcsconventions de dénomination:

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 l'invoquant phpcsà l'aide du --standarddrapeau. Par exemple:

> phpcs --standard=PEARish Test.php

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

> sudo phpcs --config-set default_standard PEARish

Voir le manuel phpcs pour plus d'informations.

À M
la source
C'était vraiment pratique - j'ai utilisé cette réponse pour supprimer les erreurs survenant le long de la ligne "La classe doit être dans un espace de noms d'au moins un niveau" ainsi que les erreurs de nommage des fonctions de cas de chameau. J'utilise PSR2 autant que possible, mais en éditant un site Magento, je ne suis pas en mesure de parcourir et de renommer chaque fonction et de trier l'espace de noms.
Dave Child
7

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

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 ce serait probablement difficile à écrire.

L'autre option est d'utiliser un système de modèles puisque vous avez dit que vous ne vouliez pas passer à un framework. Smarty et Twig peuvent tous deux être utilisés en dehors d'un framework MVC. Passez à l'un de ceux-ci, puis demandez à PHPCS d'analyser uniquement les fichiers .PHP, pas les fichiers de modèle.

dragonmantank
la source