Composer - это де-факто стандартный менеджер зависимостей в PHP, появившийся в 2012 году. Его можно сравнить с npm в JavaScript или pip в Python: он управляет внешними библиотеками (пакетами), которые нужны вашему проекту. Composer представляет собой обычный PHP скрипт, т.е. программу, написанную на языке PHP.

В современном мире почти невозможно писать проекты полностью с нуля. Мы используем библиотеки:

  • для работы с базами данных (например, Doctrine ORM),
  • для тестирования (PHPUnit),
  • для работы с HTTP (Guzzle),
  • для шаблонизации (Twig),

и многие другие.

Composer позволяет:

  • Устанавливать сторонние пакеты из репозитория Packagist.
  • Управлять версиями зависимостей (гарантировать, что проект соберется у всех одинаково).
  • Автоматически подгружать классы через autoload.
  • Делить зависимости на рабочие (require) и для разработки (require-dev).

При установке PHP пакетов Composer не просто устанавливает их, он также устанавливает все зависимости, от которых эти пакеты зависят. Т.е., например, если загружаемая библиотека будет зависеть от 3 других пакетов, а каждая из них, ещё в свою очередь от нескольких и так далее, то Composer всё это установит автоматически.

Загрузку сторонних библиотек Composer выполняет в папку vendor, которую данный PHP скрипт создаёт в корневой директории проекта. Кроме этого, он ещё создаёт специальный файл autoload.php, включив который в проект вы сразу же подключите к нему все ранее загруженные им библиотеки.

require "path/to/vendor/autoload.php";

Дополнительно при загрузке сторонних библиотек Composer генерирует ещё файл composer.lock. Если composer.json - это главный файл Composer, в котором содержится описание основных пакетов, включая требования к их версиям, то composer.lock - это файл, содержащий уже не требования, а реальные версии пакетов, которые им были установлены на компьютер пользователя.

Основное назначение файла composer.lock заключается в полном сохранении среды, в которой осуществлялась разработка и тестирование проекта.

Например, если вы захотите скопировать проект в какое-то другое место без переноса файла composer.lock, то выполнив в нём команду composer install, вы можете получить другие версии пакетов. Это может случиться из-за выхода новых версий как основных пакетов, описанных в файле composer.json, так и их зависимостей, зависимостей их зависимостей и т.д. Например, представим что выход новых версий основных пакетов не произошёл, но обновились версии у пакетов, от которых зависят основные пакеты. В результате установки работающего проекта, можем получить неработоспособный, если в какой-нибудь новой версии одного из этих пакетов была допущена ошибка. Поэтому если вы хотите сохранить полностью среду, то при копировании проекта необходимо дополнительно включать в проект файл composer.lock.

Например, разворачивая проект на production, включающий в себя файл composer.lock, вы получите те же версии зависимостей, которые у вас были при разработке и тестировании.


Как Composer работает "под капотом"?

1. Вы создаете composer.json - файл с описанием зависимостей вашего проекта.

2. Composer читает этот файл и ищет пакеты на Packagist.org.

3. Composer разрешает зависимости: проверяет версии, чтобы библиотеки не конфликтовали друг с другом.

4. Формирует composer.lock - файл с зафиксированными конкретными версиями.

5. Скачивает пакеты в папку vendor/.

6. Создает autoload-файл (vendor/autoload.php), чтобы подключать классы автоматически.


Файл composer.json

Главный конфигурационный файл проекта.

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The skeleton application for the Laravel framework.",
    "keywords": ["laravel", "framework"],
    "license": "MIT",
    "require": {
        "php": "^8.2",
    },
    "require-dev": {
        "fakerphp/faker": "^1.23",
        "phpunit/phpunit": "^11.5.3"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "test": "phpunit"
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "config": {
        "optimize-autoloader": true,
        "sort-packages": true
    },
    "minimum-stability": "stable",
    "prefer-stable": true
}

Объяснение секций:

  • name. Имя пакета в формате vendor/project. Уникальное имя.
  • type. Тип пакета: library, project, metapackage, composer-plugin.
  • description. Краткое описание проекта.
  • keywords. Ключевые слова для поиска на Packagist.
  • license. Лицензия (MIT, GPL и т. д.).
  • require. Основные зависимости (production).
  • require-dev. Зависимости только для разработки.
  • autoload. Настройки автозагрузки (PSR-4, classmap, files).
  • autoload-dev. Автозагрузка для dev-зависимостей.
  • scripts. Кастомные команды (тесты, миграции, хуки).
  • extra. Доп. параметры для фреймворков и плагинов.
  • config. Настройки Composer (автозагрузка, порядок пакетов).
  • minimum-stability. Минимальная стабильность пакетов (stable, beta, alpha, dev).
  • prefer-stable. Предпочитать стабильные версии при выборе.

Файл composer.lock

Этот файл фиксирует точные версии зависимостей.

  • composer.json говорит: "мне нужен Guzzle версии ^7.0 (любая от 7.0.0 до <8.0)".
  • composer.lock говорит: "мы установили именно 7.8.0".

Зачем нужен:

  • Чтобы все разработчики в команде использовали одинаковые версии.
  • Чтобы сборки на CI/CD всегда были стабильными.

Автозагрузка (autoload)

Composer автоматически генерирует autoload-файл:

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

После этого все классы из установленных пакетов доступны в проекте.

Например, мы установили Guzzle:

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

use GuzzleHttp\Client;

$client = new Client();
$response = $client->get('https://alishoff.com');

echo $response->getBody();

Как это работает:

  • В composer.json пакеты указывают правила автозагрузки (PSR-4, PSR-0, classmap, files).
  • Composer собирает эти правила в vendor/composer/autoload_*.php.
  • При вызове класса PHP сам его подключает.

require vs. require-dev

require - зависимости, без которых проект не будет работать.

Пример: guzzlehttp/guzzle.

require-dev - зависимости, которые нужны только при разработке или тестировании.

Пример: phpunit/phpunit.

composer install --no-dev

Эта команда установит только "боевые" зависимости (актуально для продакшена).


Основные команды Composer

- Вывод списка всех доступных команд

composer list

- Получение подробной справки по команде

composer help require

- Создание базового варианта файла composer.json с помощью мастера

composer init

Создать новый проект

Создание нового проекта из указанного пакета в текущую директорию выполняется так:

composer create-project vendor/package

Установка пакета

composer require vendor/package
composer require "twig/twig:^2.0"

Composer позволяет устанавливать пакеты, которые будут доступны только для разработки. Для этого используйте опцию --dev:

composer require --dev vendor/package
composer require --dev phpunit/phpunit

- Установка всех пакетов в проект

composer install

Эта команда работает следующим образом:

  • проверяет, имеется ли файл composer.lock;
  • если файл composer.lock существует, то устанавливает версии, указанные в нём;
  • если файла composer.lock нет, то разрешает зависимости, описанные в файле composer.json, создаёт файл composer.lock и устанавливает зависимости.

Обновление зависимостей

composer update
composer update --dev
composer update vendor/package

Эта команда обновит все зависимости, установленные в проекте до последних версий (в соответствии с composer.json) и файл composer.lock. Если необходимо обновить не все пакеты, а один или несколько, то их необходимо перечислить через пробел.

- Удаление пакета

composer remove vendor/package
composer remove vendor/package vendor2/package2
composer remove --dev phpunit/phpunit

- Обновление Composer

composer self-update

Команда для обновления Сomposer до последней версии.

- Список пакетов, для которых есть обновления

composer outdated

Поиск пакетов

Следующей командой можно сделать поиск пакетов в репозиториях:

composer search laravel

- Вывод всех установленных библиотек

Команда для отображения всех установленных PHP пакетов:

composer show

- Команда для диагностики

Если вы считаете, что нашли ошибку, или что-то ведет себя странно, возможно, вы захотите выполнить команду диагностики для выполнения автоматизированной проверки многих общих проблем:

composer diagnose

- Показать информацию о лицензиях зависимостей

composer licenses

- Проверка валидности файла composer.json

composer validate

- Очистка внутреннего кэша пакетов Composer

composer clear-cache

- Вывести зависимости для указанного пакета

composer depends vendor/package

Пересобрать автозагрузку

composer dump-autoload

Source: Orkhan Alishov's notes