Оригинал: Upgrade your PHP projects using these tools & tips

Перевод для канала Мы ж программист

Экосистема PHP полна инструментов, которые помогут вам писать лучший код и создавать более надежные проекты, используйте их!

За годы работы в качестве PHP-разработчика мне довелось работать с самыми разными командами, архитектурами и рабочими процессами.

Во всех этих проектах неизменными оставались несколько вещей: стандарты, инструменты и процессы.

Давайте рассмотрим некоторые рекомендации для ваших PHP-проектов!

Используйте статические анализаторы (PHPStan, Sonar)

Один из инструментов, который действительно изменил мою работу в качестве PHP-разработчика, – это PHPStan (Sonar также можно использовать, но не так легко). Для тех, кто не знаком, PHPStan – это статический анализатор кода, который читает ваш код и вылавливает потенциальные ошибки до того, как они попадут в производство.

Он проверяет такие проблемы, как типы данных и структуры массивов (например, пустые переменные), помогая выявить ошибки на ранней стадии.

Рассмотрим распространенный пример:

PHP
<?php

// In the context of a Repository
function getUser(int $id): User
{
  // Retrieve the user, somehow
}

// ...

// In the context of a Controller
$payload = $request->deserialise(UserUpdateModel::class);
$user = $this->userRepository->getUser($payload->userId);

Если $payload->userId содержит null, этот код может вызвать 500 Internal Server Error и сломать приложение.
PHPStan обнаружил бы эту потенциальную проблему во время разработки – запуск приложения не требуется!

Обеспечение единого стиля кода (PSR-12)

Соблюдение единого стиля кода очень важно для обеспечения читаемости и поддержки кода, а PSR-12 является широко признанным стандартом в сообществе PHP.

Придерживаясь PSR-12, вы обеспечиваете четкую структуру кода и слаженную работу членов команды. Одним из наиболее эффективных инструментов для соблюдения этого стандарта является PHP_CodeSniffer (phpcs), который проверяет ваш код на соответствие определенным стандартам и помогает исправить проблемы до того, как они попадут в прод.

Автоматизируйте работу с помощью Make (или другого инструмента, например Robo)

Использование таких инструментов автоматизации задач, как Make, может значительно упростить ваш рабочий процесс разработки, стандартизировав взаимодействие с инструментами и контейнерами (или другими вещами).

Если вы не знакомы с этими инструментами, то суть такова: вместо того чтобы многократно набирать одни и те же длинные команды, вы можете создать удобные ярлыки в Makefile.

Например, вместо того чтобы многократно выполнять команду docker compose exec -it server bash для доступа к терминалу контейнера, вы можете создать простой Makefile, например, такой:

Makefile
DKC = docker compose

up: ## Starts the Docker containers
    $(DKC) up --detach

stop: ## Stops the Docker containers
    $(DKC) stop

bash: ## Access bash
    $(DKC) exec -it server bash

Теперь вы можете просто набрать make up для запуска контейнеров или make bash для открытия терминала, что сэкономит ваше время и силы.

Для больших проектов с более сложными задачами можно использовать Robo, который предлагает дополнительные возможности настройки.

Используйте надежные и актуальные фикстуры

Правильно подготовленные фикстуры необходимы для бесперебойного рабочего процесса разработки, предоставляя последовательные и реалистичные тестовые данные для моделирования реальных сценариев. Кроме того, они делают разработчиков счастливее, я гарантирую!

Регулярное обновление фикстур по мере развития проекта позволяет избежать проблем с устаревшими данными, что делает тестирование и отладку более эффективными.

Автоматизация загрузки фикстур и организация данных в модульные наборы могут упростить этот процесс, а интеграция фикстур в конвейеры CI/CD обеспечивает надежную тестовую среду.

Использование инструментов генерации динамических данных, таких как Faker, вносит разнообразие и реалистичность в тесты, а управление версиями фикстур позволяет синхронизировать их с изменениями кода.

Следуйте стратегии тестирования

  • Unit-тесты с PHPUnit: Модульное тестирование гарантирует, что отдельные компоненты вашего кода работают так, как ожидается.
  • Интеграционные тесты: Проверяют, как различные части системы работают вместе, особенно полезны для сложных приложений.
  • Функциональные тесты с помощью Behat: Особенно полезно для разработки, ориентированной на поведение, позволяя тестировать реальные рабочие процессы пользователей.
  • Используйте тестовое дублирование, например, моки (mocks), чтобы изолировать компоненты во время тестирования, обеспечивая актуальность и сфокусированность тестов.

Проверяйте архитектуру с помощью PHP Arkitect

  • Установите и соблюдайте архитектурные стандарты: PHP Arkitect помогает обеспечить чистую и консистентную архитектуру, устанавливая правила, которые определяют структуру вашей кодовой базы. Это предотвращает появление непредвиденных шаблонов и сохраняет работоспособность проекта по мере его роста.
  • Определите и задокументируйте вашу архитектуру: Определите архитектурные правила, такие как многоуровневые ограничения или ограничения зависимостей, которые соответствуют требованиям вашего проекта. Документирование этих правил позволяет понять, как должны взаимодействовать компоненты, что уменьшает двусмысленность для разработчиков.
  • Продвигайте изоляцию модулей: PHP Arkitect обеспечивает строгие зависимости между модулями, гарантируя изолированность компонентов. Такая изоляция помогает сохранять тестируемость модулей, уменьшает сцепление и способствует рефакторингу.

Например, PHP Arkitect поможет определить, какие сервисы ваши контроллеры могут вызвать , какая логика может быть выполнена вместо фабрики (Factory).

Контейнеризуйте

  • Используйте Docker для создания согласованных сред разработки, зеркально отражающих прод. Это гарантирует, что любой код, запущенный в деве, будет вести себя аналогично в проде.
  • Используйте этапы сборки для обмена одними и теми же базовыми образами между средами дева и прода, чтобы убедиться, что во всех средах используются одни и те же точные версии всех зависимостей. (Вы же не хотите, чтобы в проде были ошибки, которые вы не можете воспроизвести локально, потому что ваша версия OpenSSL не совпадает с локальной, поверьте мне).
  • Настройте файл docker-compose.yml для управления несколькими сервисами, такими как веб-серверы, базы данных, уровни кэширования, системы очередей…

Настройте непрерывную сборку и доставку (Continuous Integration & Deployment, CI/CD)

  • Автоматизируйте тестирование и развертывание с помощью конвейеров CI/CD, используя такие платформы, как GitHub Actions, GitLab CI или Jenkins.
  • Настройте автоматические тесты, линтеры и анализаторы кода для выполнения каждого push- или pull-запроса, чтобы убедиться, что новые изменения не нарушают существующую функциональность и что новый код соответствует стандартам проекта.
  • Последовательное развертывание в производственных средах с механизмами отката, если это возможно.

Все эти механизмы должны сделать ваш PHP-проект надежнее, проще в работе и в целом лучше.

Они также позволяют команде лучше работать вместе, гарантируя, что все члены группы следуют одним и тем же стандартам и процессам!