steevanb / composer-overload-class
向 composer.json 中添加额外内容,以覆盖自动加载的类
1.4.0
2021-11-29 16:42 UTC
Requires
- php: ^5.4.0 || ^7.0 || ^8.0
Requires (Dev)
- composer/composer: 2.1.*
README
composer-overload-class
允许覆盖自动加载的类,以包含您的文件而不是假定的文件。
有时,您需要覆盖一个依赖项中的类。但是,您不能,因为您在依赖项中发现了一个很棒的 "new Foo\Bar()"...
因此,如果您的项目使用 Composer 自动加载(例如,例如 Symfony 项目),则可以使用 steevanb/composer-overload-class。
通过简单的配置,您可以指定 Composer 在哪个文件中查找一个类(您的文件),而不是让它查找具有类命名空间的原文件。因为您不能更改原始类的命名空间和类名,否则所有对此命名空间/类名的依赖都将失败(使用 Foo\Bar,方法参数类型等),composer-overload-class 将将 Foo\Bar 类的内容克隆到 ComposerOverloadClass\Foo 命名空间中。
您的类需要与覆盖的类具有完全相同的命名空间,并且如果需要,您可以扩展 ComposerOverloadClass\Foo\Bar。
安装
composer require steevanb/composer-overload-class ^1.4
配置
要覆盖一个类,您需要通过您的 composer.json 进行配置。
示例来自 steevanb/doctrine-stats,用于覆盖 Doctrine ObjectHydrator
# composer.json { "scripts": { "__comment": "Add a script who generate cloned classes, when autoload is generated", "pre-autoload-dump": "steevanb\\ComposerOverloadClass\\OverloadClass::overload" }, "extra": { "__comment": "Path to a writable directory, where overloaded classes will be cloned, with it's namespace prefixed by ComposerOverloadClass, in prod + dev env", "composer-overload-cache-dir": "var/cache/prod", "__comment": "Path to a writable directory, in dev env", "composer-overload-cache-dir-dev": "var/cache/dev", "__comment": "Classes to overload, in prod + dev env", "composer-overload-class": { "__comment": "Fully qualified class name you want to overload", "Doctrine\\ORM\\Internal\\Hydration\\ObjectHydrator": { "__comment": "Path to original file, who contains the class you want to overload", "original-file": "vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php", "__comment": "Path to your file, who contains your class", "overload-file": "vendor/steevanb/doctrine-stats/ComposerOverloadClass/Doctrine/ORM/Internal/ObjectHydrator.php", "__comment": "false (default) : duplicate original class, add ComposerOverloadClass namespace prefix, you can extend it", "__comment": "true : do not duplicate original class, you need to write all code in your classe", "duplicate-original-file": false } }, "__comment": "Classes to overload, in dev env", "composer-overload-class-dev": {} }, "autoload": { "psr-4": { "ComposerOverloadClass\\": "var/cache/prod/ComposerOverloadClass" } }, "autoload-dev": { "psr-4": { "ComposerOverloadClass\\": "var/cache/dev/ComposerOverloadClass" } }, }
配置完成后,您需要重新生成 Composer 自动加载
composer dumpautoload
# show overrided files
composer dumpautoload -v
这就是全部!
Doctrine ObjectHydrator 示例
示例来自 steevanb/doctrine-stats,用于覆盖 Doctrine ObjectHydrator,以在实体被填充时添加计时器
# src/ComposerOverloadClass/Doctrine/ORM/Internal/ObjectHydrator.php namespace Doctrine\ORM\Internal\Hydration; use Doctrine\ORM\EntityManagerInterface; use steevanb\DoctrineStats\Doctrine\ORM\Event\HydrationEventsTrait; # extends cloned ObjectHydrator class, I just want to change hydrateAllData() code class ObjectHydrator extends \ComposerOverloadClass\Doctrine\ORM\Internal\Hydration\ObjectHydrator { use HydrationEventsTrait; protected function getEntityManager(): EntityManagerInterface { return $this->_em; } protected function hydrateAllData(): void { $eventId = $this->dispatchPreHydrationEvent(); parent::hydrateAllData(); $this->dispatchPostHydrationEvent($eventId); } }