• Час читання ~7 хв
  • 20.02.2023

Станом на Laravel 9, чудовий Laravel Pint поставляється в комплекті з новою установкою Laravel. Я люблю Pint, і для більшості людей достатньо використовувати його для всього форматування в стилі коду. До Laravel Pint я віддав перевагу поєднанню PHP CS Fixer і PHP Codesniffer — обидва вони чудові в тандемі та пропонують унікальні правила, які можуть допомогти забезпечити дотримання стилю коду.

Стиль довжини рядка є одним із прикладів того, де PHP Codesniffer може доповнювати такі інструменти, як PHP CS Fixer, і ми можемо використовувати обидва, щоб допомогти розробникам дотримуватися послідовного стилю коду. Якщо використовується PSR-12, розділ "Лінії" містить таку інформацію про довжину лінії:

НЕ ПОВИННО бути жорсткого обмеження довжини лінії.

М'яке обмеження довжини рядка ПОВИННО становити 120 символів.

Рядки НЕ ПОВИННІ бути довшими за 80 символів; рядки, довші за цей, ПОВИННІ бути розділені на кілька наступних рядків не більше 80 символів кожен.

Наші інструменти CI можуть застосовувати як м'які, так і жорсткі межі довжини лінії, але спосіб, яким я інтерпретую PSR-12, полягає в тому, що PHP Codesniffer повинен попереджати нас і не повертати жодних помилок для рядків довжиною > 80. Про це ми і поговоримо далі в статті.

Давайте попрацюємо над налаштуванням PHP Codesniffer у новому проекті Laravel, а потім у наступних підручниках ми дізнаємося, як створити власний стандарт PHP Codesniffer, яким ми можемо поділитися у всіх наших проектах.

По дорозі я покажу вам деякі налаштування конфігурації, які я люблю встановлювати, щоб отримати максимальну віддачу від PHP Codesniffer під час розробки.

Налаштування Перше,

що ми зробимо, це створимо приклад проекту, щоб ви могли побачити, як включити PHP Codesniffer з Laravel з нуля:

laravel new phpcs-part-1 --git
cd phpcs-part-1

Прапор git встановить нову програму Laravel, ініціалізує git і зобов'яже все контролювати версію. Це залишає нам чистий шифер, щоб побачити зміни, які ми вносимо під час цього підручника.

Далі давайте встановимо PHP Codesniffer як залежність від розробки:

composer require --dev squizlabs/php_codesniffer

Примітка: На момент написання статті необхідна команда встановлює версію ^3.7, але ваша версія може трохи відрізнятися, що не викликає занепокоєння. Якщо ви запустите

phpcs з командного рядка, ви побачите, що він хоче, щоб ви вказали шлях:

$ vendor/bin/phpcs
ERROR: You must supply at least one file or directory to process.

Run "phpcs --help" for usage information

Не хвилюйтеся, ми збираємося додати файл конфігурації, щоб вказати, які шляхи PHPCS повинен включати (і виключити), але якщо ви запустите його з набором правил за замовчуванням (Pear), ви отримаєте купу помилок з установкою Laravel за замовчуванням:

$ vendor/bin/phpcs -v app
Registering sniffs in the PEAR standard... DONE (28 sniffs registered)
....
FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Providers/AppServiceProvider.php
--------------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
--------------------------------------------------------------------------------
 2 | ERROR | Missing file doc comment
 7 | ERROR | Missing doc comment for class AppServiceProvider
--------------------------------------------------------------------------------

Якщо ви перевірите вихідний код, ви побачите помилки, через які PHPCS виходить з ненульовим кодом:

$ echo $?
2

я хочу бути зрозумілим: ці помилки не тому, що наш код має погане форматування (зовсім навпаки), а тому, що ми використовуємо стандарт PEAR за замовчуванням, якого Laravel не дотримується з коробки.

Давайте розглянемо використання іншого стандарту і створення конфігураційного файлу. Вивчення інструментів командного рядка

Перш ніж ми додамо файл конфігурації до нашого проекту, давайте подивимося, як буде виглядати така ж конфігурація за допомогою командного рядка. Ми знаємо, що не хочемо використовувати стандарт PEAR, тому давайте спочатку запустимо нашу команду PHPCS із вбудованим стандартом PSR-12:

vendor/bin/phpcs --standard=PSR12 app

Якщо ви уважно подивитеся на вихід, ви помітите, що стандарт PSR12 для PHP Codesniffer хоче виправити деякі інтервали навколо об'єднаних рядків:

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 означає, що ми можемо автоматично виправляти ці нюхання (не всі нюхачі PHP Codsniffer автоматично можна виправити) за допомогою урни phpcbf, яка поставляється з Codesniffer. Ми дійдемо до цього за секунду.

Для початку давайте подивимося на кілька інших командних прапорців, які я вважаю за краще використовувати. Як тільки ви почнете використовувати PHP Codesniffer в розробці та CI, я помічаю, що повна назва нюхача не очевидна. Можливо, ви захочете налаштувати цей нюх, проігнорувати його на певному рядку тощо.

Щоб завжди бачити повний нюх у командному рядку, ви можете використовувати прапорець '-s':

vendor/bin/phpcs -s --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
    |       |     (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 нюхати можна знайти в наведеному вище прикладі. Якщо ми хочемо проігнорувати цей нюх у файлі ядра.php ми можемо додати це до файлу програми / консолі / ядра.php приблизно в рядку 28: Якщо ми повторно запустимо команду - цього разу для файлу

// phpcs:disable PSR12.Operators.OperatorSpacing.NoSpaceAfter
$this->load(__DIR__.'/Commands');
// phpcs:enable

ядра.php - ми можемо побачити, що правило NoSpaceAfter вимкнено для цього рядка, але ми все одно отримуємо помилку NoSpacePre:

vendor/bin/phpcs -s --standard=PSR12 app/Console/Kernel.php
FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php
----------------------------------------------------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------------------------------------------------
 29 | ERROR | [x] Expected at least 1 space before "."; 0 found
    |       |     (PSR12.Operators.OperatorSpacing.NoSpaceBefore)
----------------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------------------------------------------------

Ми можемо вимкнути кілька правил для заданого набору рядків, розділивши комами нюхачі таким чином:

// phpcs:disable PSR12.Operators.OperatorSpacing.NoSpaceAfter, PSR12.Operators.OperatorSpacing.NoSpaceBefore
$this->load(__DIR__.'/Commands');
// phpcs:enable

Нарешті, давайте повернемо всі зміни, внесені до файлу програми/консолі/ядра.php Ви виявите, що ці два правила, які ми використовували як приклад, прямо суперечать Ларавелю Пінту, який очікує пробіли до і після.

По-перше, давайте автоматично виправимо вищезазначені нюхання за допомогою phpcbf:

vendor/bin/phpcbf --standard=PSR12 app

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

Після запуску давайте запустимо Laravel Pint, щоб побачити, як він робить зворотний бік того, що PHP Codesniffer виправив автоматично:

$ vendor/bin/pint
  FIXED  54 files,    1 style issue fixed
  ✓ app/Console/Kernel.php   concat_space

Щоб ми могли використовувати обидва інструменти під час розробки та в середовищах CI, нам потрібно вибрати стиль і застосувати його одним інструментом і відключити від іншого. Я віддаю перевагу автоматичним виправленням з Pint, тому відключаю конкуруючий Sniff в PHP Codesniffer.

Файл конфігурації

Давайте вирішимо конфлікт між Pint і Codesniffer шляхом створення конфігураційного файлу. У програмі я зазвичай створюю файл phpcs.xml, але якщо ви плануєте дозволити іншим використовувати вашу програму як відправну точку, ви можете розглянути можливість використання phpcs.xml.dist. Давайте створимо його як phpcs.xml:

<?xml version="1.0"?>
<!-- @see https://pear.php.net/manual/en/package.php.php-codesniffer.annotated-ruleset.php -->
<ruleset name= "Laravel PHPCS Rules">

    <description>PHPCS ruleset for Example app.</description>

    <file>tests</file>
    <file>app</file>

    <!-- Show progress of the run -->
    <arg value= "p"/>

    <!-- Show sniff codes in all reports -->
    <arg value= "s"/>

    <!-- Our base rule: set to PSR12 -->
    <rule ref="PSR12">
        <exclude name="PSR12.Operators.OperatorSpacing.NoSpaceBefore"/>
        <exclude name="PSR12.Operators.OperatorSpacing.NoSpaceAfter"/>
    </rule>

    <rule ref= "Generic.Files.LineLength">
        <properties>
            <property name="lineLimit" value="80"/>
            <property name="absoluteLineLimit" value="120"/>
        </properties>
    </rule>
    <rule ref="PSR1.Methods.CamelCapsMethodName.NotCamelCaps">
        <exclude-pattern>tests/</exclude-pattern>
    </rule>

</ruleset>

Ви можете побачити, що я додав наш аргумент -s до конфігурації, тому всі звіти показують коди нюху. Ми також націлюємося на програми та тестуємо каталоги, але не соромтеся налаштовувати інші каталоги у вашому проекті, які ви хочете перевірити Codesniffer.

Ми відключили інтервали між операторами, тому Pint повинен бути щасливий, і PHP Codesniffer тепер проігнорує ці правила.

Ми також налаштували правило довжини лінії, використовуючи мову в PSR-12 як наш посібник для обмеження лінії та максимального значення. Ці нюхачі повідомляють як попередження, тому, коли ви запускаєте цей інструмент у CI, ви захочете переконатися, що або попередження придушені, або що CI все ще проходить з попередженнями. Попередження покликані допомогти вам, розробнику, виправити довжину ліній в розробці.

Нарешті, нюхання NotCamelCaps виключено в папці тестів, тому що мені подобається писати тести PHPUnit зі зміїним корпусом:

/* @test */
public function it_does_something_awesome()

Тепер ми можемо запускати phpcs без будь-яких аргументів, і він підбере наш файл конфігурації. Ви повинні бачити лише попередження про довжину рядка та кілька імпортів.

vendor/bin/phpcs

Ще одним порушенням, яке ви помітите, є MultipleImport sniff, який пов'язаний з цим рядком, наприклад:

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    // ...
}

Не соромтеся відключити цей нюх, якщо хочете, або ви можете автоматично виправити його (за допомогою нашого файлу конфігурації) за допомогою бін командного рядка phpcbf:

vendor/bin/phpcbf
.........F..........F.. 23 / 23 (100%)

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
----------------------------------------------------------------------------------------------
A TOTAL OF 2 ERRORS WERE FIXED IN 2 FILES
----------------------------------------------------------------------------------------------

Висновок

Ми охопили зовсім небагато землі, але ви повинні мати можливість почати використовувати PHP Codesniffer з нуля з Laravel. Це може бути відмінним доповненням, якщо ви хочете орієнтуватися на деякі конкретні правила, які PHP CS Fixer не виконує, і я надав вам можливість вимкнути суперечливі правила або правила, які ви хочете відключити.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297