meiji / composer-overload-class-php8
将额外内容添加到 composer.json 中,以覆盖自动加载的类(支持 PHP 8)
1.3.4
2021-11-16 04:02 UTC
Requires
- php: ^5.4.0 || ^7.0 || ^8.0
README
从 steevanb/composer-overload-class 分支出来
composer-overload-class
允许覆盖自动加载的类,用你的文件代替预定的文件。
有时,你需要覆盖一个依赖中的类。但是你不能,因为你在这个依赖中某个地方发现了一个“new Foo\Bar()”...
所以,如果你的项目使用 Composer 自动加载(例如,例如 Symfony 项目),你可以使用 meiji/composer-overload-class。
通过简单的配置,你可以指定 Composer 在哪个文件中找到一个类(你的文件),而不是让它找到具有类命名空间的原始文件。因为你不能改变原始类的命名空间和类名,否则所有对这个命名空间/类名的依赖都将失败(使用 Foo\Bar,方法参数类型等),composer-overload-class 将 Foo\Bar 类的内容克隆到 ComposerOverloadClass\Foo 命名空间。
你的类需要与被覆盖的类具有完全相同的命名空间,如果你需要,你可以扩展 ComposerOverloadClass\Foo\Bar。
安装
composer require meiji/composer-overload-class ^1.3
配置
要覆盖一个类,你需要通过你的 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": "Meiji\\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);
}
}