Перейти к содержанию
Innovialabs

Composer и стандарты PSR: как настроить современный PHP-проект

Практика3 мин

Коротко

Современный PHP-проект начинается с composer.json: Composer ставит зависимости и даёт автозагрузку по PSR-4, а PHP-CS-Fixer и PHPStan держат стиль по PSR-12 и ловят ошибки до запуска.

Из чего состоит современный PHP-проект

Минимальный набор, с которого стоит начинать любой проект:

  • Composer — менеджер зависимостей и автозагрузчик классов.
  • PSR-4 — правило, по которому имя класса соответствует пути к файлу.
  • PSR-12 — общий стиль кода, чтобы любой разработчик читал проект без привыкания.
  • PHP-CS-Fixer — автоматически приводит код к стилю.
  • PHPStan — статический анализ: находит ошибки типов и опечатки без запуска кода.

PSR — это рекомендации группы PHP-FIG, которые поддерживают большинство фреймворков и библиотек.

Шаг 1. composer.json

Создайте проект командой composer init или напишите файл вручную:

{
    "name": "acme/shop",
    "type": "project",
    "require": {
        "php": ">=8.2"
    },
    "require-dev": {
        "phpstan/phpstan": "^2.0",
        "friendsofphp/php-cs-fixer": "^3.0"
    },
    "autoload": {
        "psr-4": { "Acme\\Shop\\": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "Acme\\Shop\\Tests\\": "tests/" }
    },
    "config": {
        "sort-packages": true
    }
}

Ключевые моменты:

  • require — то, что нужно в продакшене; require-dev — инструменты разработки.
  • Указывайте версию PHP в require: Composer не даст поставить несовместимые пакеты.
  • composer.lock коммитьте в репозиторий для приложений. Он фиксирует точные версии, и у всех собирается одно и то же.
  • На сервере ставьте зависимости командой composer install --no-dev --optimize-autoloader.

Шаг 2. Автозагрузка по PSR-4

PSR-4 связывает пространство имён с папкой. При настройке выше класс Acme\Shop\Order\Invoice должен лежать в src/Order/Invoice.php:

<?php

declare(strict_types=1);

namespace Acme\Shop\Order;

final class Invoice
{
    public function __construct(
        private readonly int $amount,
    ) {
    }
}

Подключите автозагрузчик один раз в точке входа:

require __DIR__ . '/../vendor/autoload.php';

После изменения секции autoload выполните composer dump-autoload. Регистр в именах файлов и папок должен точно совпадать с именем класса: на Linux-сервере invoice.php и Invoice.php — разные файлы.

Шаг 3. Стиль кода: PSR-12 и PHP-CS-Fixer

PSR-12 описывает отступы, расположение скобок, порядок use, объявление типов. Запоминать не нужно — это делает PHP-CS-Fixer. Конфигурация .php-cs-fixer.dist.php:

<?php

$finder = PhpCsFixer\Finder::create()
    ->in([__DIR__ . '/src', __DIR__ . '/tests']);

return (new PhpCsFixer\Config())
    ->setRules(['@PSR12' => true])
    ->setFinder($finder);

Команды:

  • vendor/bin/php-cs-fixer fix — исправить код;
  • vendor/bin/php-cs-fixer fix --dry-run --diff — только показать нарушения (для CI).

Набор правил @PSR12 можно заменить на более новый @PER-CS, который развивает PSR-12.

Шаг 4. Статический анализ: PHPStan

PHPStan проверяет типы, несуществующие методы, неправильные аргументы. Файл phpstan.neon:

parameters:
    level: 6
    paths:
        - src
        - tests

Запуск: vendor/bin/phpstan analyse.

Как внедрять без боли:

  • В новом проекте начинайте с высокого уровня строгости.
  • В старом — начните с низкого и повышайте постепенно, либо сохраните текущие ошибки в baseline (--generate-baseline) и запрещайте только новые.

Шаг 5. Скрипты и CI

Соберите команды в секцию scripts composer.json:

"scripts": {
    "cs": "php-cs-fixer fix --dry-run --diff",
    "stan": "phpstan analyse",
    "check": ["@cs", "@stan"]
}

Теперь composer check одинаково запускается у разработчика и в CI. Пайплайн, который падает на нарушениях стиля и ошибках анализа, работает надёжнее любых договорённостей.

Частые ошибки

  • Не коммитят composer.lock — на сервере ставятся другие версии пакетов.
  • Правят код в vendor/ — изменения пропадут при следующей установке.
  • Несовпадение namespace и пути — класс не находится только на продакшене.
  • Включают анализ на максимум в старом коде — тысячи ошибок, и инструмент отключают.

Частые вопросы

Composer и PSR-4 нужны всегда — это просто удобнее ручных require. PHP-CS-Fixer и PHPStan настраиваются за минуты и окупаются, как только над кодом работает больше одного человека.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.