如果继承和覆写 vendor 目录下的类?

如何需要对 vendor 下面某个package 进行修改?
简单来就讲,就是先自定义一个class 继承原本的class,再用自定义的class alias 回的原本来类
这个问题,已经有老外在 stackoverflow 里提问了,
stackoverflow.com/questions/530972...
回答中说的方法,我试了,是不行的。

目前我只能从vendor上复制class文件到自己的目录下,改namespace,自定义的类继承它,再 alias回原本的类来实现

大家有什么好的建议?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

修改其它包的源码吗?我之前简单的做法是将修改后的文件拷贝到自己的项目目录下(比如项目根目录),并加入版本库。然后在composer.json的scripts编写脚本命令进行原文件的替换。也可以加在post-install-cmd中(即 composer install之后替换该文件)。

    "post-install-cmd": [
        "@php -r \"copy('xx.php', 'vendor/xx/xx.php');\""
    ],
    "cp-file": [
        "@php -r \"copy('xx.php', 'vendor/xx/xx.php');\""
    ]
3年前 评论

stackoverflow上面的方法是依赖于容器的注入,当注入一个类的时候,容器会先根据绑定关系去实例化,如果找不到绑定关系,会丢给composer来处理,而composer加载原理是根据注册的命名空间查找的,两者加载机制不一样,你可以修改composer 注册的命名空间指定自己的类文件,利用composer.jsonclassmap

3年前 评论

把你用的包 fork一个出来,使用你fork修改后的包

3年前 评论

适配器模式 应该可以满足你的需求

3年前 评论

重写吧 可能真的

然后 找到了一个新方法

github.com/composer/composer/issue...

composer.json

    "autoload": {
        "psr-4": {
            "Encore\\Admin\\Form\\Field\\": "custom/Encore/Admin/Form/Field/",
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
3年前 评论

重写一个类,很简单,就继承

问题是,你这个类是如何被调用的,被实例化的,,,这点直接关系到,你重写的类,有没有用,,,

一般如果扩展包,考虑到这种情况,一个是可以通过配置文件,自定义某个处理类,或者使用容器解析类实例,,,

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!