如何配置PHP CodeSniffer以允许我的case语句以我喜欢的方式缩进?

如何配置PHP CodeSniffer以允许我的case语句以我喜欢的方式缩进?,php,emacs,static-analysis,codesniffer,Php,Emacs,Static Analysis,Codesniffer,我有如下代码: function processRequest() { // get the verb $method = strtolower($_SERVER['REQUEST_METHOD']); switch ($method) { case 'get': handleGet(); break; case 'post': handlePost(); // $data = $_POST; break

我有如下代码:

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;
  }
}
<?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>
PHP CodeSniffer抱怨那些case语句的缩进。在使用flymake的emacs中,它如下所示:

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

信息是:

错误-行缩进不正确;应为2个空格,找到4个(PEAR.WhiteSpace.ScopeIndent.error)

显然,CodeSniffer希望case语句的缩进程度低于实际情况


我如何告诉CodeSniffer允许我的case语句按我希望的方式缩进。或者更好的方法是,强制我的case语句以这种方式缩进?

称为
PEAR.Whitespace.ScopeIndent
的嗅探在代码文件
phpcs\CodeSniffer\Standards\PEAR\Sniffs\Whitespace\ScopeIndentSniff.php
中定义,包括以下代码:

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
请参阅
$nonIndentingScopes
?这显然意味着switch语句范围内的任何内容都不应该相对于作用域开头curly缩进

我在
PEAR.Whitespace.ScopeIndent
中找不到调整此设置的方法,但是。。。。该嗅探扩展了更基本的
泛型.Whitespace.ScopeIndent
,它不包括
$nonindingscopes
数组中的
T\u开关

因此,我所做的是以我想要的方式允许我的case语句修改我的ruleset.xml文件,排除该嗅探的PEAR版本,并包括该嗅探的通用版本。看起来是这样的:

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

我的自定义编码标准
......
....
该文件需要存在于PHP CodeSniffer标准目录下的子目录中。对我来说,文件位置是
\dev\phpcs\CodeSniffer\Standards\MyStandard\ruleset.xml

然后我像这样运行PHPC:

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

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

omigosh如果可以,我会支持这篇文章。我记不起了,我很高兴我曾经把它公开发布在这里。谢谢你,我,分享这个。这节省了我很多时间。