Как настроить PHP CodeSniffer, чтобы позволить моим операторам деления отступать так, как мне нравится? - PullRequest
7 голосов
/ 11 марта 2012

У меня есть код, который выглядит так:

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 жалуется на отступы этих операторов. В emacs с flymake это выглядит так:

enter image description here

Сообщение:

ошибка - строка с неправильным отступом; ожидается 2 пробела, найдено 4 (PEAR.WhiteSpace.ScopeIndent.Incorrect)

Очевидно, CodeSniffer хочет, чтобы операторы case были МЕНЬШЕ с отступом, чем они есть.

Как я могу сказать CodeSniffer, чтобы позволить моим операторам делаться так, как я хочу. Или лучше, чтобы принудительно указывал, что мои заявления с делами имеют отступ таким образом?

1 Ответ

12 голосов
/ 11 марта 2012

Sniff, известный как 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, ожидается, что не будет иметь отступ относительно фигурного открытия области.

Я не смог найти способ настроить этот параметр в PEAR.Whitespace.ScopeIndent, но .... этот Sniff расширяет более простой Generic.Whitespace.ScopeIndent, который не включает T_SWITCH в массиве $nonIndentingScopes.

Итак, что я сделал для того, чтобы в моих утверждениях case было так, как я хотел, это изменил мой файл ruleset.xml, исключил PEAR-версию этого сниффа и включил универсальную версию этого сниффа. Это выглядит так:

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

Этот файл должен присутствовать в поддиректории в каталоге Standards для PHP CodeSniffer. Для меня расположение файла \dev\phpcs\CodeSniffer\Standards\MyStandard\ruleset.xml

Затем я запускаю phpcs так:

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

...