Иногда бывает нужно временно поправить баг или опечатку в стороннем пакете composer. Попробуем найти решение.

Проблема

Есть у нас зависимость от какого-то пакета. Среди файлов этого пакета (внутри vendor) мы нашли баг/опечатку, который мешает нам “жить” 🙂. А тут у нас еще и CI теперь есть, и все что было поправлено локально (внутри vendor) в нее не попадет. Тут мы начинаем думать…

Решения

Мы можем “подменить” реализацию из пакета на свою. Для этого мы находим проблемный класс, пускай это будет файл:

1
vendor/maintainer/package/src/ImplementationBug.php

Нужно скопировать его куда-то в свой проект, пускай это будет папка overrides в корне проекта (или где-то еще, положение не принципиально, но лучше что бы она была вне psr-autoload папок).

Теперь в composer.json внутри autoload создаем свойство exclude-from-classmap (ссылка на документацию) в виде списка исключений и указываем наш файл там. Так же не забываем добавить пусть к нашему “исправленному файлу” в папке overrides:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "autoload": {
    "exclude-from-classmap": [
      "vendor/maintainer/package/src/ImplementationBug.php"
    ],
    "files": [
      "overrides/ImplementationBug.php"
    ]
  }
}

Важно отметить: namespace в исправленном файле должен остаться прежним, при этом название файла может не совпадать с оригиналом, ведь мы напрямую подгружаем файл. Итого класс имеет “оригинальный” namespace и имя класса, и при потребности его использовать он уже окажется загружен, без необходимости поиска его через psr-autoload.

Дополнительно

Так как этот баг/опечатка могут оказаться не найденными долгое время, лучше добавить issue для мейнтейнера пакета. А еще лучше конечно правильно оформленный PR 😉. Ведь ссылку хоть на issue, хоть на PR можно будет добавить в виде комментария в файл внутри overrides, что бы пришедший после разработчик понял “зачем тут это все” и поправил когда в основной пакет “долетит” фикс.