6. Про якість коду. Code Style. Статичний аналіз коду. Liters. PHP Insights.

Відео версія
(YouTube - для зворотнього зв'язку)

Використовуй Static Code Analysis, Linters, Code formatter

Нічого не покращить якість вашого коду та швидкість ревю як використання автоматичних інструментів для код стайлінгу. Бонусом отримаєте виявлення помилок на ранніх стадіях.

Перевіряйте рішення, а не стиль коду.

Дуже часто команди запроваджують правила написання коду "на словах". Кидають один одному посилання на стандарти. І витрачаю безліч часу на перевірку та конфлікти при перевірці, яка ніколи не бува, ідеальною. І дуже часто це доводить до того, що навіть розробники з досвідом б'ють себе в груди доказуючи, що review це "підрахунок пробілів" і воно тільки заважає розробці.

То ж, будь ласка, витратьте максимум пару годин на початку розробки, або пару вихідних на проєкт що розробляється, і налаштуйте code formatter або ж linter. Обов'язково додайте перевірку на pre-commit та як крок до CI/CD.

Для PHP і Laravel зокрема рекомендую придивитися на PHP Insights. Це рішення комбінація статичного код аналізатора linter з додатковими бонусом - аналіз вразливостей composer залежностей та показника цикломатичної складності коду.

І ще маленький бонус саме Insights це "графічне" відображення результатів аналізу. Звісно це не обов'язково, але іноді бува, корисно показати зелені квадратики з надписом 100% замовнику.

PHP Insights report

PHP Insights не єдиний варіант, спокійно користуйтеся іншими рішеннями типу PHP_CodeSniffer, Psalm, PHPMD та інші. Звісно ж шукайте готові збірки з правилами, це буде набагато швидше.

І будьте готові що перші пів року розробки налаштування правил буде активно змінюватися командою, не соромтесь їх налаштовувати під свої потреби.

Тут зверніть увагу на:

Показники яких треба досягти для успішної перевірки
 'requirements' => [
     'min-quality' => 100,
     'min-complexity' => 85,
     'min-architecture' => 100,
     'min-style' => 100,
     'disable-security-check' => false,
 ],

min-quality, min-architecture, min-style - завжди ставте 100. Нема практичного сенсу давати люфт на порушення якихось правил. Правте самі правила якщо необхідно.

min-complexity - Не опускайте нижче 80. З часом ви помітите що саме поганий код понижує цей показник, і "складні" скрипти php insights підсвітить.

'disable-security-check' => false ніколи не вимикайте перевірку безпеки. Insight автоматично сканує ваші залежності та звіряє з базою даних відомих вразливостей. Перевірка не пройде якщо якась ваша залежність має вразливість і це дуже круто! Ідеально цю перевірку увімкнути навіть за розкладом для проєктів у проді. Зазвичай спільнота швидко реагує на знайдені вразливості, і правки займають не більше 12 годин. Просто чекаєте (або допомагаєте) коли виправлять, робите composer update і спіть спокійно.

Перевірка вразливостей залежностей важлива! Тримайте увімкненою в PHPInsight або ж налаштовуйте свою.

Також ви повинні знати що будь-яке правило кодстайлу ви можете відключити для файлу або конкретного рядка

відключаємо UnusedParameter
/**
 * @phpcsSuppress SlevomatCodingStandard.Functions.UnusedParameter
 */
 $someUnusedParameter

І звісно не забуваємо додати в pre commit hook

.husky/pre-commit
docker exec -t bh-app php artisan insights --fix --no-interaction
git add $(git diff --cached --name-only --diff-filter=ACM)
  • docker exec -t bh-app php artisan insights --fix --no-interaction - правимо код одразу з перевіркою. Це дуже зручно не змушує розробників думати про код стайл взагалі.
  • git add $(git diff --cached --name-only --diff-filter=ACM) - Додаємо всі файли які вже були в індексації до індексації знову. Це потрібно що автоправки додались до коміту без зайвої турботи розробника

І одразу додаємо перевірку як степ CI/CD step.

.gitlab-ci.yml
stages:
  - test

default:
  image: docker:26.1.3-alpine3.19
  services:
    - docker:26.1.3-dind

insights:
  stage: test
  before_script:
    - cp .env.example .env
    - echo UID=$(id -u) >> .env
    - echo GID=$(id -g) >> .env
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker compose up app -d --no-deps
    - docker compose exec app composer install --no-scripts
  script:
    - docker compose exec app php artisan insights --no-interaction

Тут

  • docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - авторизація для отримання доступу до app контейнеру. Обов'язково в проєкті з Docker контейнером Settings => CI/CD => Token Access => Limit access to this project. Add group or project додаємо назву проєкту або групи (підгрупи).
  • docker compose up app -d --no-deps - запускаємо лише app контейнер, без залежностей (depends_on)