phpcs: Как я могу изменить PSR2, чтобы проверить, что скобка находится на той же линии, что и метод?

Я потратил более двух часов на попытку выяснить, как требовать { в той же строке, что и объявление метода, вместо требования по умолчанию, являющегося следующей строкой. Как я могу это сделать? Я скопировал стандарт PSR2 в новую папку с именем PSR2, чтобы изменить его по своему вкусу. Итак, базой, над которой я работаю, является, в основном, стандарт PSR2, который я бы хотел изменить.

Я пробовал файл ruleset.xml, и я попытался изменить его в коде непосредственно без успеха.

<rule ref="PEAR.Classes.ClassDeclaration">
    <properties>
        <property name="eolChar" value="{"/>
    </properties>
</rule>
<rule ref="PSR2R.Classes.ClassDeclaration">
    <properties>
        <property name="eolChar" value="{"/>
    </properties>
</rule>

Я уже понял, что это неправильно. EOL устанавливается с помощью phpcs. Но я не могу понять, есть ли вообще значение, которое я могу настроить с помощью правила.

Это прекрасно работает для меня до сих пор (закручивайте глупые пространства !!!):

<?xml version="1.0"?>
<ruleset name="PSR2R">
    <description>PSR2 with tabs instead of spaces.</description>
    <arg name="tab-width" value="4"/>
    <rule ref="PSR2">
        <exclude name="Generic.WhiteSpace.DisallowTabIndent"/>
    </rule>
    <rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
    <rule ref="Generic.WhiteSpace.ScopeIndent">
        <properties>
            <property name="indent" value="4"/>
            <property name="tabIndent" value="true"/>
        </properties>
    </rule>
</ruleset>

Но я хотел бы добавить правило выше.

Ответ 1

Поместите этот код в свой файл ruleset.xml:

<rule ref="PSR2">
    <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine" />
</rule>
<rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie" />

Это будет включать стандарт PSR2, но исключить конкретное сообщение о скобе, которое должно быть в одной строке. Затем он включает в себя Generic sniff, который заставляет метод и функции фигурные скобки находиться в следующей строке.

С этим изменением этот код:

<?php
namespace Test;

class Foo
{
    public function bar() {
    }
}

Не будет ошибок, но запуск PSR2 непосредственно над ним вызывает одну ошибку:

FILE: temp.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
 6 | ERROR | [x] Opening brace should be on a new line
----------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------

Ответ 2

В дополнение к ответу Грега, если вы используете PHPStorm, перейдите в " Settings → Editor → Inspections → PHP → Code Sniffer и вы увидите вариант" Show sniff name.

enter image description here

Это даст вам имя правила о нарушении (сначала настройте исполняемый путь PHP Code Sniffer в Settings → Languages and frameworks → PHP → Code sniffer). Затем в подсказке с предупреждением в файле исходного кода осторожно переместите курсор, выберите текст и не отпуская кнопку, нажмите Control C чтобы скопировать его.

Затем вы вставляете его в правила:

<?xml version="1.0"?>
<ruleset name="PSR2R">
    <rule ref="PSR2">
        <exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine" />
        <exclude name="PSR2.Classes.ClassDeclaration.OpenBraceNewLine" />
    </rule>
    <rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie" />
</ruleset>

Я добавил здесь PSR2.Classes.ClassDeclaration.OpenBraceNewLine к исключенным правилам.