2012-03-11 9 views
6

Ho codice che assomiglia a questo:Come configurare PHP CodeSniffer per consentire il rientro delle mie istruzioni case nel modo che preferisco?

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 lamenta i rientri di quelle istruzioni case. In emacs con flymake sembra che questo:

enter image description here

Il messaggio è:

errore - Linea rientrato in modo non corretto; previsto 2 spazi, trovato 4 (PEAR.WhiteSpace.ScopeIndent.Incorrect)

Ovviamente CodeSniffer desidera che le istruzioni del caso siano meno rientrate di quelle che sono.

Come posso dire a CodeSniffer di consentire il rientro delle mie affermazioni nel modo in cui le voglio. O meglio, per far rispettare che le mie affermazioni sui casi sono rientrate in questo modo?

risposta

11

Lo Sniff noto come PEAR.Whitespace.ScopeIndent è definito nel file di codice phpcs\CodeSniffer\Standards\PEAR\Sniffs\Whitespace\ScopeIndentSniff.php e include il seguente codice:

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 

Vedere le $nonIndentingScopes? Apparentemente significa che qualsiasi cosa nell'ambito di un'istruzione switch è prevista per non essere rientrata rispetto all'oscillazione dell'oscilloscopio.

non riuscivo a trovare un modo per modificare questa impostazione in PEAR.Whitespace.ScopeIndent, ma .... che Sniff estende la più fondamentale Generic.Whitespace.ScopeIndent, che non include T_SWITCH nella matrice $nonIndentingScopes.

Quindi quello che ho fatto per consentire alle mie istruzioni case nel modo in cui volevo era modificare il mio file ruleset.xml, per escludere la versione PEAR di quell'annusamento e includere la versione generica di quell'annusamento. Ecco come si presenta:

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

Questo file deve essere presente in una sottocartella nella directory standard per PHP CodeSniffer. Per me, la posizione del file è \dev\phpcs\CodeSniffer\Standards\MyStandard\ruleset.xml

Poi corro phpcs come questo:

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

+0

Omigosh vorrei upvote questo post se potessi. Non riuscivo a ricordare questo, e sono così felice che una volta l'ho postato qui pubblicamente. Grazie, ME, per aver condiviso questo. Mi ha risparmiato un sacco di tempo. – Cheeso

Problemi correlati