Composer: практический пример PHP
Материал для ae-nekrasov.ru. Проверено 6 ноября 2026 года.

Требуется PHP 8.2 или новее в ветке 8.x и Composer 2.
Для установки зависимостей нужен доступ к интернету. После установки все
шесть демонстрационных сценариев работают без сетевых запросов.

БЫСТРЫЙ СТАРТ

1. Распакуйте архив в отдельную папку, например composer-demo.
2. Откройте терминал в этой папке. Здесь должен находиться composer.json.
3. Выполните команды:

php --version
composer --version
composer install
composer run demo -- ok

Последняя команда выводит: Александр
Composer также может вывести служебную строку запуска @php demo.php ok.

ШЕСТЬ СЦЕНАРИЕВ

composer run demo -- ok
  Успешный HTTP 200 и корректный JSON. Имя: Александр. Код завершения: 0.

composer run demo -- 404
  HTTP 404. Выводится сообщение об HTTP-ошибке. Код завершения: 1.

composer run demo -- 503
  HTTP 503. Выводится сообщение об HTTP-ошибке. Код завершения: 1.

composer run demo -- json
  HTTP 200, но повреждённый JSON. Код завершения: 1.

composer run demo -- schema
  JSON синтаксически корректен, но не содержит строкового поля name.
  Код завершения: 1.

composer run demo -- network
  Смоделированная ошибка соединения. Код завершения: 1.

Для прямого вызова без дополнительного вывода Composer:

php demo.php ok
php demo.php 404

Неизвестное имя сценария выводит список допустимых вариантов и завершает
PHP-скрипт с кодом 2. В PowerShell код последней команды доступен в
$LASTEXITCODE; в Bash — в $?. Ненулевые коды в ошибочных сценариях ожидаемы.

КАК ЭТО РАБОТАЕТ

composer.json описывает зависимости и связывает App\ с каталогом src/.
composer.lock фиксирует проверенные версии зависимостей.
vendor/ появится после composer install; в архив он намеренно не включён.
demo.php подключает vendor/autoload.php и запускает выбранный сценарий.
src/UserApi.php содержит обычный класс App\UserApi, загружаемый по PSR-4.

Guzzle MockHandler возвращает заранее заданный ответ или исключение.
Адрес api.example.test учебный: реальный HTTP-запрос к нему не отправляется.
HandlerStack::create добавляет стандартный обработчик HTTP-ошибок.
ConnectException обрабатывается отдельно от RequestException.
JSON_THROW_ON_ERROR позволяет обработать повреждённый JSON через JsonException.
Проверка поля name отделяет корректный JSON от корректных данных приложения.
Monolog выводит диагностическую запись в STDERR. Файлы логов не создаются.

Если заменить mock реальным API, нужно убрать настройку handler, указать
настоящий base_uri и проверить ожидаемую структуру данных. Оставьте timeout.
Этот архив демонстрирует механизм; он не подключён к какому-либо вашему API.

ПОЛЕЗНЫЕ ПРОВЕРКИ

composer validate --strict
composer run lint
composer check-platform-reqs
composer audit --locked
composer why psr/log --tree
composer dump-autoload

После правки правил autoload выполните composer dump-autoload. При обычном
PSR-4 добавление класса в уже настроенный каталог само по себе не требует
перестроения автозагрузчика. Соблюдайте регистр путей и namespace.

ПРОВЕРЕНО

Среда запуска: Windows, PHP 8.3.33, Composer 2.10.3.
Основные пакеты: guzzlehttp/guzzle 7.16.1, monolog/monolog 3.12.1.
Все шесть сценариев выполнены. composer validate --strict и
composer check-platform-reqs прошли. composer audit --locked не обнаружил
известных security advisories на дату проверки.
Для PHP 8.2 отдельно проверены ограничения пакетов в lock;
фактический запуск на PHP 8.2 не выполнялся.

ИСТОЧНИКИ

https://getcomposer.org/doc/01-basic-usage.md
https://getcomposer.org/doc/03-cli.md
https://getcomposer.org/doc/04-schema.md#autoload
https://getcomposer.org/doc/articles/scripts.md
https://docs.guzzlephp.org/en/stable/testing.html#mock-handler
https://docs.guzzlephp.org/en/stable/quickstart.html#exceptions
https://docs.guzzlephp.org/en/stable/request-options.html#http-errors

Код учебного примера распространяется по лицензии MIT.
Лицензии зависимостей находятся в установленных пакетах.
