首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写器覆盖程序包文件

编写器覆盖程序包文件
EN

Stack Overflow用户
提问于 2019-08-22 09:07:26
回答 3查看 2.7K关注 0票数 2

我正在尝试覆盖一个包文件,因为它在没有修改的情况下是不能工作的,而且它还没有更新来修复这个问题。

Package为webklex\laravel-pdfmerger,文件为PDFMerger.php

在它里面有:

代码语言:javascript
复制
use fpdi\FPDI;

为了让它正常工作,它需要:

代码语言:javascript
复制
use FPDI;

显然,每当我使用composer更新时,这个文件当然是不正确的,在这个阶段,我必须手动进入并更改文件以使其正常工作。一定有更好的办法吗?

我试图复制git包,然后使用composer导入它并尝试覆盖,composer代码片段如下所示,但它没有完成我想要它做的事情。

代码语言:javascript
复制
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"repositories": {
    "laravel-pdfmerger": {
        "type": "package",
        "package": {
            "name": "****/laravel-pdfmerger-mirror",
            "version": "1.1.1",
            "source": {
              "url": "https://bitbucket.org/****/laravel-pdfmerger-mirror.git",
              "type": "git",
              "reference": "origin/master"
            }
        }
    }
},
"require": {
  ...
  "****/laravel-pdfmerger-mirror": "1.1.1",
  "webklex/laravel-pdfmerger": "1.1"
},
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/",
        "VendorExtensions\\xerolaravel\\": "packages/vendorExtensions/xerolaravel",
        "Webklex\\PDFMerger\\PDFMerger\\": "vendor/****/laravel-pdfmerger-mirror/src/PDFMerger"
    }
},

这里的任何帮助都是很好的。

-编辑

更新了我的composer.json文件以删除存储库,并将psr-4自动加载更改为以下内容:

代码语言:javascript
复制
psr-4": {
    "App\\": "app/",
    "VendorExtensions\\xerolaravel\\": "packages/vendorExtensions/xerolaravel",
    "Webklex\\laravel-pdfmerger\\PDFMerger\\": "vendor/webklex/laravel-pdfmerger/src/PDFMerger"
}

但是,每当我使用PDFMerger时,它仍然不会覆盖原始文件。是不是因为我用的是门面?

EN

回答 3

Stack Overflow用户

发布于 2019-08-22 14:52:14

您可以通过将编辑后的包放入vendor-custom目录并将其添加到composer.jsonautoload部分来完成此操作。

代码语言:javascript
复制
"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Vendor\\Package": "vendor-custom/vendor/package"
    }
},

Gregwar psr-0示例:

代码语言:javascript
复制
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "psr-0": {
        "Gregwar\\Cache": "vendor-custom/gregwar/cache",
        "Gregwar\\Image": "vendor-custom/gregwar/image",
        "Gregwar\\ImageBundle": "vendor-custom/gregwar/image-bundle"
    }
},
票数 2
EN

Stack Overflow用户

发布于 2019-09-06 11:13:56

最终解决了这个问题……

1)在您的composer.json文件中导入Forked respository,但确保名称与您要替换的包的名称匹配;在我的示例中,webklex/laravel-pdfmerger,如下所示:

代码语言:javascript
复制
"repositories": {
    "webklex/laravel-pdfmerger": {
        "type": "package",
        "package": {
            "name": "webklex/laravel-pdfmerger",
            "version": "1.1.1",
            "source": {
              "url": "url to git",
              "type": "git",
              "reference": "origin/master"
            }
        }
    }
},

注意:请确保您设置的版本高于原始包中当前可用的版本,因此在这里我添加了.1来区分更改,并将提交标记为this,这样我就可以选择它了。

2)需要包,但确保您请求的是您在提交中标记的版本:

代码语言:javascript
复制
"require": {
    "php": ">=5.6.4",
    "webklex/laravel-pdfmerger": "1.1.1"
},

3)更新autoload,指向包的导入位置:

代码语言:javascript
复制
"autoload": {
    "classmap": [
        "database"
     ],
     "psr-4": {
        "App\\": "app/",
        "Webklex\\PDFMerger\\": "vendor/webklex/laravel-pdfmerger/src"
    }
},

运行composer update,然后转储自动加载。

然后,您应该能够按照原始包中的说明在应用程序中引用该包。

票数 1
EN

Stack Overflow用户

发布于 2019-08-23 03:31:06

在PHP中,您实际上可以将一个类作为另一个类别名,且该行为包括名称空间。

这在遗留项目中非常有用,在这些项目中,您想要开始使用名称空间,但又不想重构上述类的所有用法。

这里正好相反,类是在名称空间中定义的,但您正在使用的类不在名称空间中,不过,给类设置别名也可以。

所以你可能要找的函数是class_alias

下面是一个例子

代码语言:javascript
复制
<?php

class FPDI {
  public function __construct() { 
    var_dump('I am FPDI');
  }
}

class_alias('FPDI', 'fpdi\FPDI');

$noNamespace = new FPDI; // would, off course work
$namespace = new fpdi\FPDI(); // would work too, thanks to the class alias

因此,如果你正在使用Laravel,你的工作应该和正确地给类赋予别名一样简单。

这实际上可以在定义providers and aliases的地方完成。

所以在config/app.php开始的时候

代码语言:javascript
复制
<?php
class_alias('FPDI', 'fpdi\FPDI');

return [

    // all of the below array stays as you have it, it was just snipped for concision purpose 
];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57600844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档