2012-03-11 14 views
6

tôi có mã trông như thế này:Làm thế nào để cấu hình PHP CodeSniffer để cho phép các câu lệnh của tôi được thụt lề theo cách tôi thích?

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 phàn nàn về indents của các báo cáo trường hợp. Trong emacs với flymake nó trông như thế này:

enter image description here

Thông điệp là:

lỗi - Dòng thụt vào không đúng cách; dự kiến ​​2 không gian, được tìm thấy 4 (PEAR.WhiteSpace.ScopeIndent.Incorrect)

Rõ ràng CodeSniffer muốn các câu lệnh case được LESS thụt lề hơn chúng.

Làm cách nào tôi có thể yêu cầu CodeSniffer cho phép báo cáo trường hợp của tôi được thụt lề theo cách tôi muốn. Hoặc tốt hơn, để thi hành rằng các tuyên bố trường hợp của tôi được thụt vào theo cách này?

Trả lời

11

Các Sniff gọi là PEAR.Whitespace.ScopeIndent được định nghĩa trong mã tập tin phpcs\CodeSniffer\Standards\PEAR\Sniffs\Whitespace\ScopeIndentSniff.php và bao gồm các mã sau:

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 

Xem $nonIndentingScopes? Nó có nghĩa là bất cứ điều gì trong phạm vi của một tuyên bố chuyển đổi dự kiến ​​sẽ không được thụt vào đối với phạm vi mở xoăn.

tôi không thể tìm thấy một cách để điều chỉnh thiết lập này trong PEAR.Whitespace.ScopeIndent, nhưng .... mà Sniff mở rộng cơ bản hơn Generic.Whitespace.ScopeIndent, mà không bao gồm T_SWITCH trong mảng $nonIndentingScopes. Vì vậy, những gì tôi đã làm để cho phép báo cáo trường hợp của tôi theo cách tôi muốn là để sửa đổi tập tin ruleset.xml của tôi, để loại trừ phiên bản PEAR của sniff đó, và bao gồm các phiên bản chung của sniff đó. Có vẻ như sau:

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

Tệp này cần phải có mặt trong một thư mục con theo thư mục Tiêu chuẩn cho PHP CodeSniffer. Đối với tôi, vị trí tập tin là \dev\phpcs\CodeSniffer\Standards\MyStandard\ruleset.xml

Sau đó, tôi chạy phpcs như thế này:

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

+0

omigosh tôi sẽ upvote bài này nếu tôi có thể. Tôi không thể nhớ điều này, và tôi rất vui khi tôi đăng nó ở đây công khai. Cảm ơn bạn, ME, đã chia sẻ điều này. Nó đã cứu tôi rất nhiều thời gian. – Cheeso