2012-03-11 10 views
6

tengo código que se parece a esto:¿Cómo configurar PHP CaseSniffer para permitir que las sentencias de mi caso se sangren de la manera que me gusta?

function processRequest() { 

    // get the verb 
    $method = strtolower($_SERVER['REQUEST_METHOD']); 

    switch ($method) { 
    case 'get': 
     handleGet(); 
     break; 
    case 'post': 
     handlePost(); 
     // $data = $_POST; 
     break; 
    case 'delete': 
     handleDelete(); 
     break; 
    case 'options': 
     header('Allow: GET, POST, DELETE, OPTIONS'); 
     break; 
    default: 
     header('HTTP/1.1 405 Method Not Allowed'); 
     break; 
    } 
} 

PHP CodeSniffer se queja de los guiones de las declaraciones de casos. En emacs con flymake se ve así:

enter image description here

El mensaje es:

error

- Línea sangría incorrectamente; 2 plazas de espera, encontraron 4 (PEAR.WhiteSpace.ScopeIndent.Incorrect)

Obviamente CodeSniffer quiere las declaraciones de casos a ser menos sangría de lo que son.

¿Cómo puedo decirle a CodeSniffer que permita que las sentencias de mi caso se sangren de la manera que yo las quiero? O mejor, a hacer cumplir que mis declaraciones de casos están sangrados de esta manera?

Respuesta

11

El Sniff conocido como PEAR.Whitespace.ScopeIndent se define en el archivo de código phpcs\CodeSniffer\Standards\PEAR\Sniffs\Whitespace\ScopeIndentSniff.php e incluye el siguiente código:

class PEAR_Sniffs_WhiteSpace_ScopeIndentSniff extends Generic_Sniffs_WhiteSpace_ScopeIndentSniff 
{ 
    /** 
    * Any scope openers that should not cause an indent. 
    * 
    * @var array(int) 
    */ 
    protected $nonIndentingScopes = array(T_SWITCH); 

}//end class 

Véase el $nonIndentingScopes? Aparentemente, significa que cualquier cosa dentro del alcance de una instrucción switch se espera que no tenga sangría con respecto a la apertura del alcance rizado.

no pude encontrar una manera de ajustar esta configuración en PEAR.Whitespace.ScopeIndent, pero .... que Sniff extiende el Generic.Whitespace.ScopeIndent más básica, que no incluye T_SWITCH en la matriz $nonIndentingScopes.

Entonces, lo que hice para permitir mis declaraciones de casos de la manera que quería fue modificar mi archivo ruleset.xml, excluir la versión PEAR de ese sniff e incluir la versión genérica de ese sniff. Se ve así:

<?xml version="1.0"?> 
<ruleset name="Custom Standard"> 
    <!-- http://pear.php.net/manual/en/package.php.php-codesniffer.annotated-ruleset.php --> 
    <description>My custom coding standard</description> 

    <rule ref="PEAR"> 
     ...... 
    <exclude name="PEAR.WhiteSpace.ScopeIndent"/> 
    </rule> 

    .... 

    <!-- not PEAR --> 
    <rule ref="Generic.WhiteSpace.ScopeIndent"> 
    <properties> 
     <property name="indent" value="2"/> 
    </properties> 
    </rule> 

</ruleset> 

Este archivo debe estar presente en un subdirectorio bajo el directorio de Normas para PHP CodeSniffer. Para mí, la ubicación del archivo es \dev\phpcs\CodeSniffer\Standards\MyStandard\ruleset.xml

Luego ejecutar phpcs así:

\php\php.exe \dev\phpcs\scripts\phpcs --standard=MyStandard --report=emacs -s file.php

+0

Omigosh me habría upvote este post si pudiera. No podía recordar esto, y estoy muy contento de haberlo publicado aquí públicamente. Gracias, YO, por compartir esto. Me ahorró mucho tiempo. – Cheeso

Cuestiones relacionadas