Современная экосистема: Composer, PSR, фреймворки
Связь с предыдущими темами
В прошлых статьях вы:
принимали HTTP-запросы и формировали HTTP-ответы
строили код через ООП, исключения и слои (контроллеры, сервисы, репозитории)
подключали базу данных через SQL и PDO, использовали транзакции и миграцииЧтобы уверенно расти до уровня Middle, нужно освоить экосистему PHP: как подключать библиотеки, как писать код в общепринятом стиле и как использовать фреймворки, не теряя понимания того, что происходит внутри.
Эта статья про три ключевых компонента современной PHP-разработки:
Composer — менеджер зависимостей и автозагрузчик
PSR — стандарты, которые позволяют библиотекам работать вместе
Фреймворки — готовая инфраструктура для веб-приложений!Как Composer, PSR-4 и пакеты связываются в одном проекте
Composer
Что такое зависимость и пакет
Зависимость — внешняя библиотека, без которой ваш проект не работает или которую вы используете для удобства.
Пакет — опубликованная библиотека (набор файлов с кодом), которую можно подключить в проект.
В PHP пакеты чаще всего устанавливают через Composer — стандартный менеджер зависимостей.
Официальный сайт и документация: Composer
Каталог пакетов: Packagist
Зачем Composer в реальной разработке
Composer решает две базовые задачи:
устанавливает и обновляет библиотеки
подключает классы автоматически через автозагрузкуБез Composer вы быстро приходите к хаосу из ручных require и копирования чужого кода в проект.
Основные файлы Composer
#### composer.json
Это описание вашего проекта:
какие пакеты нужны
какие версии подходят
как настроить автозагрузкуПример минимального composer.json:
#### composer.lock
Это зафиксированные версии зависимостей.
Практическое правило команды:
composer.json задаёт какие версии разрешены
composer.lock фиксирует какие версии реально установленыИменно composer.lock помогает получить одинаковые зависимости на ноутбуке разработчика, на CI и на проде.
Установка и обновление зависимостей
Базовые команды:
composer install — установить зависимости строго по composer.lock
composer update — подобрать новые версии в рамках ограничений из composer.json и обновить composer.lockРекомендация для повседневной работы:
на сервере и в CI почти всегда используется composer install
composer update делают осознанно, обычно отдельным изменением, чтобы контролировать обновленияВерсионирование и ограничения версий
Composer использует правила семантического версионирования (идея в том, что версии вида MAJOR.MINOR.PATCH отражают масштаб изменений).
Документация: Composer: Versions and constraints
Практический смысл ограничений:
^2.0 обычно означает: можно обновляться в пределах 2.x, но не на 3.0
фиксировать версию впритык (например, 2.3.1) стоит редко, когда есть веская причинаrequire и require-dev
Зависимости делятся на две группы:
require — нужно для работы приложения в проде
require-dev — нужно для разработки (тесты, линтеры, статанализ)Примеры dev-инструментов:
тестирование: PHPUnit
статический анализ: PHPStan
автоматическое форматирование: PHP CS FixerДля уровня Middle важно понимать: инструменты качества кода — часть экосистемы и процесса разработки.
Автозагрузка классов
Composer генерирует файл vendor/autoload.php. Его обычно подключают один раз в точке входа.
Пример public/index.php:
Теперь классы из src/ и из vendor/ будут подгружаться автоматически.
PSR-4 в Composer: как классы сопоставляются с файлами
Если у вас настройка:
то класс App\Http\Response должен лежать примерно здесь:
src/Http/Response.phpПосле изменения настроек автозагрузки нужно выполнить:
Документация: Composer: Autoloading
Мини-практика: подключаем логгер через Composer
Одна из типичных задач в веб-приложении — логировать ошибки.
Установим популярный логгер Monolog:
Использование:
``php
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
logger->pushHandler(new StreamHandler(__DIR__ . '/app.log', Logger::INFO));
_SERVER и php://input напрямую
затем делали свой Request и Response
PSR-7 предлагает общий контракт, чтобы библиотека роутинга, middleware и ваш код говорили на одном языкеЕсли вы используете фреймворк или микрофреймворк, вы часто косвенно используете эти стандарты.
PSR-11: контейнер зависимостей
Контейнер — это объект, который умеет выдавать нужные зависимости (например, PDO, репозитории, сервисы) по запросу.
Стандарт контейнера: PSR-11
Связь с прошлой статьёй про Dependency Injection:
вы продолжаете передавать зависимости через конструктор
контейнер помогает собирать граф объектов в одной точке и не делать это вручную во всех местахФреймворки
Что такое фреймворк
Фреймворк — это набор готовых компонентов и правил, который берёт на себя инфраструктуру приложения.
Обычно фреймворк предоставляет:
роутинг
контроллеры и слой HTTP
контейнер зависимостей
обработку ошибок
валидацию
работу с базой (в разной степени)
миграции и инструменты для CLIФреймворк не отменяет знания базовых вещей из прошлых статей. Наоборот: чтобы не быть junior, который умеет только нажимать кнопки, важно понимать, как это устроено внутри.
Два самых популярных фреймворка
| Фреймворк | Сильные стороны | Когда часто выбирают |
| --- | --- | --- |
| Laravel | высокая скорость разработки, богатая экосистема | продуктовая разработка, CRUD, быстрый старт |
| Symfony | модульность, строгая архитектура, сильные компоненты | крупные системы, сложная доменная логика, долгоживущие проекты |
Официальные источники:
Laravel Documentation
Symfony DocumentationЧто фреймворк делает с вашим кодом
Главная идея: вместо того чтобы вы писали весь каркас сами, вы пишете бизнес-логику внутри правил фреймворка.
Если вспомнить слои из прошлой статьи:
Router и Request/Response чаще всего уже есть
Controller остаётся точкой, где вы превращаете HTTP во вызов сервиса
Service и Repository остаются вашими: там живут правила и SQL (через PDO или ORM)То есть ваш опыт с архитектурой, исключениями и транзакциями отлично переносится.
Middleware: полезная техника из экосистемы
Middleware — это шаг обработки запроса, который можно вставить в цепочку.
Типичные middleware:
аутентификация
логирование
ограничение частоты запросов (rate limit)
CORS
обработка ошибокИдея middleware особенно формализована в PSR-15, но встречается и в других реализациях.
Когда фреймворк не нужен
Фреймворк — не обязательная цель, а инструмент. Бывают ситуации, когда он избыточен:
очень маленький проект
внутренний скрипт или CLI-утилита
сервис, где важна минимальная зависимость и контроль над каждым слоемНо даже тогда Composer и PSR почти всегда нужны.
Как выбирать фреймворк и не попасть в ловушку
Выбор зависит от контекста, но есть практичные критерии:
есть ли в команде опыт поддержки выбранного стека
насколько важна скорость разработки против гибкости
как выглядит экосистема пакетов вокруг фреймворка
насколько легко тестировать код и не смешивать HTTP с бизнес-логикойИ главный ориентир для Middle: вы должны уметь объяснить, как ваш код проходит путь от HTTP-запроса до SQL-запроса и обратно, независимо от того, фреймворк это или самописный каркас.
Как связать всё вместе с тем, что вы уже сделали в курсе
Если представить развитие вашего учебного приложения:
Вы начали с одного index.php и _POST.
Затем выделили Controller, Service, Repository, добавили исключения.
Добавили PDO, транзакции и миграции.
Теперь подключаете библиотеки через Composer.
Начинаете ориентироваться в PSR и понимаете, почему интерфейсы важны.
Переходите к фреймворку, где инфраструктура уже есть, но принципы остаются прежними.Так и выглядит путь от основ до уверенного Middle: вы не просто пишете PHP-код, вы строите поддерживаемую систему в индустриальном окружении.
Итоги
Вы освоили базовые элементы современной экосистемы PHP:
Composer как стандарт управления зависимостями, автозагрузкой и воспроизводимостью окружения через composer.lock
PSR как общий язык для стиля кода, автозагрузки и взаимодействия библиотек (логирование, HTTP, middleware, контейнер)
роль фреймворков и то, как они накладываются на знакомую вам слоистую архитектуруДальше по курсу логично углубляться в практику: DI-контейнер, конфигурация, логирование, тестирование, а затем собрать полноценное API или веб-приложение на одном из фреймворков с хорошей архитектурой.