Как настроить PHP CodeSniffer, чтобы мои операторы case имели желаемый отступ?

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

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

введите описание изображения здесь

Сообщение такое:

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

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

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


person Cheeso    schedule 11.03.2012    source источник


Ответы (1)


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-версию этого сниффера и включить Generic версию этого сниффа. Выглядит это так:

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

person Cheeso    schedule 11.03.2012
comment
omigosh Я бы поддержал этот пост, если бы мог. Я не мог этого вспомнить, и я так рад, что однажды опубликовал это здесь публично. Спасибо, МЕНЯ, за то, что поделились этим. Это сэкономило мне много времени. - person Cheeso; 28.04.2016