我正在尝试覆盖软件包文件,因为未经修改该文件将不起作用,并且尚未进行更新以解决此问题。
软件包为webklex\laravel-pdfmerger
,文件为PDFMerger.php
其中包含:
1) User creates an account with their email and password
2) Account is staged
3) Verification email is sent with activate link
4) User account only get activated by clicking the link
要使其正常工作,必须满足以下条件:
use fpdi\FPDI;
很明显,每当我使用composer更新时,该文件当然都是不正确的,在这个阶段,我必须手动进入并更改文件以使其正常工作。 必须有更好的方法吗?
我尝试制作git包的副本,然后使用composer导入它并尝试覆盖它,下面是composer片段,但它没有实现我想要的功能。
use FPDI;
这里的任何帮助都会很棒。
---编辑---
更新了我的composer.json文件以删除存储库并将psr-4自动加载更改为以下内容:
{
"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"
}
},
但是,每当我使用PDFMerger时,它仍然不会覆盖原始文件。是因为我正在使用Facade吗?
答案 0 :(得分:1)
您可以通过将已编辑的程序包放在vendor-custom
目录中并将其添加到autoload
的{{1}}部分中来实现。
composer.json
格雷格瓦psr-0示例:
"autoload": {
"psr-4": {
"App\\": "app/",
"Vendor\\Package": "vendor-custom/vendor/package"
}
},
答案 1 :(得分:0)
在PHP中,您实际上可以将一个类别名为另一个类,并且该行为包括名称空间。
这在旧项目中非常有用,在这些项目中,您希望开始使用名称空间,但又不想重构该类的所有用法。
您的情况与此相反,该类是在名称空间中定义的,但是您正在使用的类却不在名称空间中,
所以您可能要寻找的功能是class_alias
。
这是一个例子
<?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
的开头
<?php
class_alias('FPDI', 'fpdi\FPDI');
return [
// all of the bellow array stays as you have it, it was just snipped for concision purpose
];
答案 2 :(得分:0)
终于想出了这个...
1)在您的composer.json文件中导入Forked仓库,但是确保其名称与您要替换的软件包的名称匹配;在我的情况下,是 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 以指向该软件包已导入的位置:
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"Webklex\\PDFMerger\\": "vendor/webklex/laravel-pdfmerger/src"
}
},
运行 composer update ,然后转储自动加载。
然后您应该能够按照原始软件包中的说明在应用程序中引用该软件包。