TGViewer
Сергей Предводителев Сергей Предводителев @sergei_predvoditelev · 1.2K subscribers
Post #252 1.44K
🌿 Про опциональные зависимости в Composer

На одном из проектов добавил composer dependency analyser (писал про него тут) и он мне выдал, что у меня в зависимостях два неиспользуемых пакета:

• phpdocumentor/type-resolver
• symfony/property-access

Удалил их, проверил статанализом — всё хорошо. Тесты покрывают не весь проект, но те, что были — тоже прошли успешно. Ну и отлично, подумал я 🙂

А дальше внезапно пошли ошибки:

Unable to use the "Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor" class as the "phpdocumentor/type-resolver" package is not installed. Try running composer require "phpdocumentor/type-resolver".


Оказалось, что в проекте используется класс PhpStanExtractor из пакета symfony/property-info, которому для работы нужен пакет phpdocumentor/type-resolver. В коде у них добавлена проверка на существование класса ContextFactory из этого пакета:

public function __construct(…)
{
if (!class_exists(ContextFactory::class)) {
throw new \LogicException(…);
}
…
}


Аналогичная ситуация и с пакетом symfony/property-access — он требуется классу ObjectNormalizer из symfony/serializer.

Понятно для чего это сделано — чтобы не тянуть лишние зависимости для ситуаций, когда конкретно PhpStanExtractor и ObjectNormalizer в проекте не используются.

Но на практике это приводит к описанной проблеме, когда требуемую зависимость можно случайно удалить, будучи уверенным что, она не используется 🤷‍♂️

❓ Может быть стоит отказаться от опциональных зависимостей в библиотеках и делать пакеты с явными зависимостями?

Да, будет больше пакетов и будет менее удобно их разрабатывать, но зато мы получаем надёжное управление зависимостями. До этого случая я более нейтрально относился к опциональным зависимостям, и в Yii3 они кое-где встречаются, но сейчас весы качнулись.

🤓 Как защититься от подобных ситуациях на уровне проекта?

Конечно же, тесты. Хотя бы дымовыми тестами стоит покрыть все маршруты, это уже сильно повысит процент выявления проблем. В моём случае, это точно помогло бы.
  • 👍 14
  • ❤ 3
More from @sergei_predvoditelev
  1. Sep 20, 2026🌿 Про хардкорный курс асинхронного PHP Записался на курс по асинхронному PHP, который зап…
  2. Sep 17, 2026🌿 Про автоматическое ревью и слияние PR Егор Бугаенко в 101 выпуске вопросов/ответов расс…
  3. Sep 9, 2026Пыхник’26 — целая неделя PHP! С 28 сентября по 2 октября пройдёт Пыхник’26 — онлайн-конфер…
  4. Aug 31, 2026#инфопузырь ☕️ Инфопузырь #20 (Август 2026) Ещё один короткий выпуск... Думаю, в сентябре…
  5. Aug 27, 2026🌿 Про Ghostty Весной я переехал со стандартного GNOME Terminal на WezTerm. И всё меня уст…
  6. Aug 22, 2026🌿 Про nono В комментариях к посту про локальных агентов упомянули песочницу для агентов n…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →