PHP Codesniffer
Некоторые проекты долгоиграющие и постоянно изменяющиеся. Без неусыпного контроля база кода рискует превратиться в месиво из малочитаемых файлов. Вручную проверять код на соответствие стандартам занятие достаточно утомительное. Быстро появляется потребность в атоматизации процесса. Для этого используется PHP_CodeSniffer, это инструмент для проверки кода на соответствие принятым соглашениям и автоматического его исправления после проверки.
Установка
В самом простом случае, можно установить PHP_CodeSniffer
в папку с исходниками проекта. В более сложном варианте, используется Composer
.
Простая установка
Установим плагин вывода информации:
curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
Проверим работу:
php phpcs.phar -h
Установим плагин автаматического исправления:
curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar
Проверим работу:
php phpcbf.phar -h
Установка через Composer
Пропишем в composer.json
следующий код:
{
"require-dev": {
"squizlabs/php_codesniffer": "3.*"
}
}
Проверим работу лагина вывода информации:
./vendor/bin/phpcs -h
Проверим работу плагина автаматического исправления:
./vendor/bin/phpcbf -h
Применение
Посмотреть перечень доступных опций:
простая установкаphp phpcs.phar -h
установка через Composer./vendor/bin/phpcs -h
-
установите стандартный идентификатор, а не локальные файлы и каталоги-n
не печатать предупреждения-w
печатать как предупреждения, так и ошибки-l
только локальный каталог, без рекурсии-s
отображать sniff-коды во всех отчетах-a
запуск в интерактивном режиме-e
объясняет стандарт, показывая включенные в него проверки-p
показывает ход выполнения-q
тихий режим, отключает подробный вывод-m
останавливает запись сообщений об ошибках-v
печать обработанных файлов-vv
вывод набора правил и токена-vvv
вывод информации об обработке анализа-i
показывать список установленных стандартов кодирования-d
устанавливать для параметра [key] php.ini значение [value] в [true] если значение не указано
Посмотреть перечень доступных стандартов:
простая установкаphp phpcs.phar -i
установка через Composer./vendor/bin/phpcs -i
Сначала запустим команду PHPCS
со встроенным стандартом PSR-12
:
простая установкаphp phpcs.phar --standard=PSR12 фаил.php
установка через Composer./vendor/bin/phpcs --standard=PSR12 app
Посмотрим на вывод, скрипт хочет исправить некоторые предупреждения вокруг конкатенации строк:
FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
28 | ERROR | [x] Expected at least 1 space before "."; 0 found
28 | ERROR | [x] Expected at least 1 space after "."; 0 found
----------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------
Знак x
означает что можно исправить предупреждения автоматически, не все предупреждения можно исправить автоматически с помощью phpcbf
.
Что бы видеть полный анализ в командной строке вы можете использовать флаг -s
:
простая установкаphp phpcs.phar -s --standard=PSR12 фаил.php
установка через Composer./vendor/bin/phpcs -s --standard=PSR12 фаил.php
Пример, как выглядит вывод со всеми предупреждениями:
FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php
----------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
----------------------------------------------------------------------
28 | ERROR | [x] Expected at least 1 space before "."; 0 found
| | (PSR12.Operators.OperatorSpacing.NoSpaceBefore)
28 | ERROR | [x] Expected at least 1 space after "."; 0 found
| | (PSR12.Operators.OperatorSpacing.NoSpaceAfter)
----------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------
Найденное предупреждение PSR12.Operators.OperatorSpacing.NoSpaceBefore
в приведённом выше примере, можно игнорировать, отключить проверку можно прям в файле app/Console/Kernel.php
:
// phpcs:disable PSR12.Operators.OperatorSpacing.NoSpaceAfter
$this->load(__DIR__.'/Commands');
// phpcs:enable
Давайте автоматически исправим приведённые выше предупреждения с помощью phpcbf
:
простая установкаphp phpcbf.phar -s --standard=PSR12 фаил.php
установка через Composer./vendor/bin/phpcbf -s --standard=PSR12 фаил.php
PHPCBF RESULT SUMMARY
----------------------------------------------------------------------------------------------
FILE FIXED REMAINING
----------------------------------------------------------------------------------------------
/Users/paul/code/sandbox/phpcs-part-1/app/Models/User.php 1 0
/Users/paul/code/sandbox/phpcs-part-1/app/Http/Controllers/Controller.php 1 0
/Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php 2 0
----------------------------------------------------------------------------------------------
A TOTAL OF 4 ERRORS WERE FIXED IN 3 FILES
----------------------------------------------------------------------------------------------
Файл конфигурации
Если в проекте, есть свой ни на что не похожий code-style
, для поддержания кода поможет написание собственного набора правил в формате xml
. Конфиг позволяет отключить определенные проверки, добавлять такие функции, как панели прогресса и вывод цвета.
Пример phpcs.xml
:
phpcs.xml<?xml version="1.0"?>
<ruleset name="Custom Coding Standards">
<description>PHPCS Custom Ruleset Example</description>
<!-- PSR-12 Standard -->
<rule ref="PSR12"/>
<!-- Color the result output -->
<arg name="colors" />
<!-- Show progress of the run -->
<arg value="ps" />
<!-- Code directory -->
<file>src/</file>
<!-- Ignore file and class comment errors -->
<rule ref="Squiz.Commenting.FileComment.Missing">
<exclude-pattern>*/src/*</exclude-pattern>
</rule>
<rule ref="Squiz.Commenting.ClassComment.Missing">
<exclude-pattern>*/src/*</exclude-pattern>
</rule>
</ruleset>
После написания собственного набора правил, подключить его можно просто:
простая установкаphp phpcs.phar --standard=дириктория/phpcs.xml
установка через Composer./vendor/bin/phpcs --standard=дириктория/phpcs.xml