steevanb / composer-overload-class

向 composer.json 中添加额外内容,以覆盖自动加载的类

1.4.0 2021-11-29 16:42 UTC

This package is auto-updated.

Last update: 2024-08-29 03:26:17 UTC


README

version composer Lines Total Downloads

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。

schema

变更日志

安装

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);
    }
}