Оглавление статьи
- Вводная информация
- О стандарте кодирования в PHP
- Перечень стандартов
- Зависимости линтеров
- PHP CodeSniffer
- PHP CS Fixer
- Pre Commit
- Автоматическая проверка кода
Вводная информация
В предыдущих статьях мы настроили редактор кода VSCode и IDE PhpStorm для комфортной работы. Эта статья является вводным началом раздела Стили кодирования (PHP линтеры) перечисленных выше статей.
О стандарте кодирования в PHP
Линтер - это инструмент позволяющий коду соответствовать заданным правилам, стандартам, строгому стилю кодирования. При использовании в IDE и редакторах кода подсвечивает некорректный правилам код, а так же автоматически исправляет его при возможности.
Самыми распространенными инструментами в этом направлении являются PHP CodeSniffer и PHP CS Fixer. Различие между ними не существенны. Набор команд PHP CS Fixer более минималистичен при работе с данным линтером из командной строки, а так же он использует кэширование исправлений. В основном я использую PHP CS Fixer, хотя начинал с PHP CodeSniffer.
Не нужно ставить сразу два линтера, выберете какой-то один.
Перечень стандартов
PSR-1 - базовый стандарт кодирования
PSR-2 - устарел
PSR-4- автозагрузчик (namespace)
PSR-12 - расширенный стиль кодирования
PER Coding Style - улучшение PSR-12
Чистый код - стайл гайд для PHP
Зависимости линтеров
Для работы с линтерами необходимо установить следующие зависимости.
sudo apt install php-xml php-xmlrpc
PHP CodeSniffer
Инструкция по установке PHP CodeSniffer написана в официальном репозитории.
Установка в корень проекта
PHP CodeSniffer будет работать только с проектом в который установлен.
curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar
# ИЛИ
composer require "squizlabs/php_codesniffer=*"
Глобальная установка
PHP CodeSniffer будет работать с любым проектом.
На вопрос Do you want to re-run the command with --dev? отвечаем yes.
composer global require squizlabs/php_codesniffer
Проверка пути глобальной директории
Для того, чтобы узнать куда был установлен PHP CodeSniffer.
composer global config bin-dir --absolute
Запуск CodeSniffer
Стандартом кодирования по умолчанию в PHP_CodeSniffer является PEAR.
Что бы проверить файлы на соответствие стандарту выполните следующие команды.
# phpcs покажет ошибки
./vendor/bin/phpcs /path/to/code-directory
# phpcbf исправит ошибки
./vendor/bin/phpcbf /path/to/code-directory
# ИЛИ
~/.config/composer/vendor/bin/phpcs /path/to/code-directory
~/.config/composer/vendor/bin/phpcbf /path/to/code-directory
Переопределение стандарта PHP_CodeSniffer с PEAR на PSR-12
Чтобы проверить файл по стандарту кодирования PSR-12, добавьте следующую опцию --standard=PSR12.
phpcs --standard=PSR12 /path/to/code-directory
phpcbf --standard=PSR12 /path/to/code-directory
PHP CS Fixer
Инструкция по установке PHP CS Fixer написана на официальном сайте.
Установка в корень проекта
PHP CS Fixer будет работать только с проектом в который установлен.
curl -L https://cs.symfony.com/download/php-cs-fixer-v3.phar -o php-cs-fixer
# ИЛИ
composer require friendsofphp/php-cs-fixer
Глобальная установка
PHP CS Fixer будет работать с любым проектом.
На вопрос Do you want to re-run the command with --dev? отвечаем yes.
composer global require friendsofphp/php-cs-fixer
Проверка пути глобальной директории
Для того, чтобы узнать куда был установлен PHP CS Fixer.
composer global config bin-dir --absolute
Запуск PHP CS Fixer
Что бы проверить файлы на соответствие стандарту выполните следующие команды.
php php-cs-fixer fix /path/to/dir
php php-cs-fixer fix /path/to/file
# ИЛИ
php ~/.config/composer/vendor/bin/php-cs-fixer fix /path/to/dir
php ~/.config/composer/vendor/bin/php-cs-fixer fix /path/to/file
# Опции:
--dry-run - проверка без исправлений
--using-cache=no - не учитывать предыдущую проверку
# Например
php php-cs-fixer fix /path/to/dir --dry-run
Pre Commit
Чем хороши линтеры тем что позволяют проверить код на соответствие определенным правилам и если код им не соответствует исправить его либо оповестить о проблемах. К данной функциональности можно так же добавить проверку кода перед созданием коммита в git и если найдется ошибка коммит не состоится. Что позволит поддерживать о единообразии кода как на локальном компьютере, так и на удаленном репозитории.
Создадим файл хука Pre Commit и напишем в нем некоторую программную логику которая будет срабатывать при определенных действиях. В данном случае наш хук будет срабатывать при создании коммита.
Создадим хук введя команду. Необходимо, чтобы в проекте был проинициализирован Git.
cp .git/hooks/pre-commit.sample .git/hooks/pre-commit
Pre Commit для PHP_CodeSniffer
Не забудьте изменить username в пути на имя своего пользователя.
Содержимое созданного файла если нужно автоматическое исправление кода.
#!/bin/sh
if [ -f /home/username/.config/composer/vendor/bin/phpcbf ]
then
/home/username/.config/composer/vendor/bin/phpcbf ./
if [ $? -ne 0 ]
then
RED='\033[0;31m'
CYAN='\033[0;36m'
NA='\033[0m'
printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"
return 1
fi
fi
Содержимое созданного файла если не нужно автоматическое исправление кода.
#!/bin/sh
if [ -f /home/username/.config/composer/vendor/bin/phpcs ]
then
/home/username/.config/composer/vendor/bin/phpcs ./
if [ $? -ne 0 ]
then
RED='\033[0;31m'
CYAN='\033[0;36m'
NA='\033[0m'
printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"
return 1
fi
fi
Pre Commit для PHP CS Fixer
Не забудьте изменить username в пути на имя своего пользователя.
Содержимое созданного файла если нужно автоматическое исправление кода.
#!/bin/sh
if [ -f /home/username/.config/composer/vendor/bin/php-cs-fixer ]
then
/home/username/.config/composer/vendor/bin/php-cs-fixer fix --quiet --using-cache=no ./
if [ $? -ne 0 ]
then
RED='\033[0;31m'
CYAN='\033[0;36m'
NA='\033[0m'
printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"
return 1
fi
fi
Содержимое созданного файла если не нужно автоматическое исправление кода.
#!/bin/sh
if [ -f /home/username/.config/composer/vendor/bin/php-cs-fixer ]
then
/home/username/.config/composer/vendor/bin/php-cs-fixer fix --dry-run --quiet --using-cache=no ./
if [ $? -ne 0 ]
then
RED='\033[0;31m'
CYAN='\033[0;36m'
NA='\033[0m'
printf "\n\t${CYAN}[GIT POLICY]${NA} PHP-CS-Fixer has failed - ${RED}Push Aborted${NA}\n\n"
return 1
fi
fi
Автоматическая проверка кода
Узнайте как настроить редактор кода VSCode или IDE PhpStorm на автоматическую проверку кода линтерами.