it-swarm-es.com

Cómo ignorar ciertos errores estándar de codificación en PHP CodeSniffer

Tenemos una aplicación web PHP 5 y actualmente estamos evaluando PHP CodeSniffer para decidir si forzar estándares de código mejora la calidad del código sin causar demasiado dolor de cabeza. Si parece bueno, agregaremos un enlace de confirmación previa SVN para asegurar que todos los archivos nuevos confirmados en la rama de desarrollo estén libres de olores de codificación estándar.

¿Hay alguna forma de configurar PHP codeSniffer para ignorar un tipo particular de error? ¿o conseguir que trate un cierto error como una advertencia?

Aquí un ejemplo para demostrar el problema:

<!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>

Y esta es la salida de PHP_CodeSniffer:

> phpcs test.php 
 
 ------------------------------ -------------------------------------------------- 
 ENCONTRÓ 2 ERROR (S) Y 1 ADVERTENCIA (S) QUE AFECTAN A 3 LÍNEA (S) 
 ---------------------- -------------------------------------------------- -------- 
 1 | ADVERTENCIA | La línea excede los 85 caracteres; contiene 121 caracteres 
 9 | ERROR | Falta el comentario del documento de archivo 
 11 | ERROR | Línea sangrada incorrectamente; 0 espacios esperados, encontrado 4 
 --------------------------------------- ----------------------------------------- 

Tengo un problema con el error " Línea con sangría incorrecta ". Supongo que sucede porque estoy mezclando la sangría PHP con la sangría HTML. Pero esto lo hace más legible, ¿no? ( teniendo en cuenta que no tengo los recursos para moverme a un marco MVC en este momento ). Así que me gustaría ignorarlo por favor.

13
Tom

Encontré una solución para eliminar el error " Línea indentada incorrectamente " pero primero debo decir que dragonmantank tiene un punto excelente: usted no debe mezclar PHP y HTML. Es una receta para dolores de cabeza. Sin embargo, desafortunadamente creo que mezclar PHP y HTML es muy común, especialmente en el software heredado.

La solución más rápida y sucia asumiendo que estamos usando los estándares de codificación predeterminados phpcs (que son los estándares PEAR ) es eliminar el archivo Sniff relevante. Encuentre la ubicación de los estándares PEAR, para mí, usando bunt , fue aquí:

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

Cambie el nombre del archivo ScopeIndentSniff.php para que el sniff que verifica la sangría del código ya no se ejecute:

> Sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Trabajo realizado - ahora no se verificará la sangría y se ganó el error " Línea sangrada incorrectamente " No ocurra ( y su código no será estándar y no será de tan alta calidad ).


La solución anterior es bastante aficionada: la solución más limpia es crear un nuevo estándar de codificación que utilice todos los estándares PEAR excepto las personalizaciones seleccionadas. Esto es muy rápido de hacer. Aquí se explica cómo hacerlo utilizando getIncludedSniffs() y getExcludedSniffs() y algunas convenciones de nomenclatura 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');
    }
}
?>

Pruebe su nuevo estándar de codificación personalizado invocando phpcs utilizando el indicador --standard. Por ejemplo:

> phpcs --standard=PEARish Test.php

Una vez que esté funcionando, puede establecer su nuevo estándar como predeterminado, lo que significa que no necesita escribir el indicador --standard cada vez que use phpcs:

> Sudo phpcs --config-set default_standard PEARish

Vea el manual de phpcs para más información.

11
Tom

Te encontrarás con muchos problemas al ejecutar PHPCS con tu código PHP mezclado con HTML. PHPCS solo es realmente útil cuando analiza scripts puros PHP. Los estándares de codificación integrados se basan en PHP puro, no en PHP/HTML mixto.

Una opción sería construir su propio estándar personalizado y usarlo en su lugar. El estándar personalizado tomaría en cuenta la mezcla de código, pero probablemente sería difícil escribirlo.

La otra opción es usar un sistema de plantillas ya que dijiste que no quieres pasar a un marco. Smarty y Twig pueden usarse fuera de un marco MVC. Vaya a uno de esos y luego haga que PHPCS solo analice los archivos .PHP, no los archivos de plantilla.

7
dragonmantank