我正在尝试覆盖包文件,因为它未经修改就无法工作,并且尚未更新以解决此问题。
包webklexlaravel-pdfmerger
,文件PDFMerger.php
其中有:
use fpdiFPDI;
要使其正常工作,它需要:
use FPDI;
显然,每当我使用作曲家更新时,这个文件当然是不正确的,在这个阶段,我必须手动进入并更改文件才能使其正常工作。 一定有更好的办法吧?
我尝试制作 git 包的副本,然后使用作曲家导入它并尝试覆盖,作曲家片段如下,但它没有做我想要它做的事情。
{
"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 自动加载更改为以下内容:
psr-4": {
"App\": "app/",
"VendorExtensions\xerolaravel\": "packages/vendorExtensions/xerolaravel",
"Webklex\laravel-pdfmerger\PDFMerger\": "vendor/webklex/laravel-pdfmerger/src/PDFMerger"
}
但是每当我使用 PDFMerger 时,它仍然不会覆盖原始文件。是因为我使用的是立面吗?
终于想通了这个...
1( 在 composer.json 文件中导入分叉存储库,但请确保名称与要替换的包的名称匹配;在我的例子中,webklex/laravel-pdfmerger,就像这样:
"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 以区分更改并将提交标记为此版本,以便我可以选择它。
2(需要包,但请确保请求在提交中标记的版本:
"require": {
"php": ">=5.6.4",
"webklex/laravel-pdfmerger": "1.1.1"
},
3( 更新自动加载以指向导入包的位置:
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\": "app/",
"Webklex\PDFMerger\": "vendor/webklex/laravel-pdfmerger/src"
}
},
运行编辑器更新,然后转储自动加载。
然后,您应该能够按照原始包中的说明在应用程序中引用该包。
您可以通过将编辑的包放在vendor-custom
目录中并将其添加到composer.json
的autoload
部分来执行此操作。
"autoload": {
"psr-4": {
"App\": "app/",
"Vendor\Package": "vendor-custom/vendor/package"
}
},
格雷格瓦尔 psr-0 示例:
"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"
}
},
在 PHP 中,您实际上可以将一个类别名化为另一个类,并且该行为包括命名空间。
这在您希望开始使用命名空间但又不想重构所述类的所有用法的遗留项目中非常有用。
你在这里有相反的情况,类是在命名空间中定义的,但你使用的类不在命名空间中,尽管如此,别名类就可以了。
因此,您可能正在寻找的功能是class_alias
.
这是一个例子
<?php
class FPDI {
public function __construct() {
var_dump('I am FPDI');
}
}
class_alias('FPDI', 'fpdiFPDI');
$noNamespace = new FPDI; // would, off course work
$namespace = new fpdiFPDI(); // would work too, thanks to the class alias
因此,如果您使用的是 Laravel,您的工作应该像正确为类别名一样简单。
这实际上可以在您定义providers
和aliases
的地方完成。
所以在config/app.php
开始时
<?php
class_alias('FPDI', 'fpdiFPDI');
return [
// all of the below array stays as you have it, it was just snipped for concision purpose
];