如何在Laravel 5.5中扩展供应商包服务提供者

17

我正在使用一个能够与Xero会计整合的包。

他们有一个名为XeroServiceProvider.php的文件,位于以下位置:/vendor/drawmyattention/xerolaravel/Providers/XeroServiceProvider.php

我需要在我的应用程序中扩展这个服务提供者,但我不喜欢直接编辑这个文件的想法。

是否有一种方法可以轻松地扩展此服务提供程序而不更新供应商文件?

这是我需要扩展的文件:

namespace DrawMyAttention\XeroLaravel\Providers;

use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use \App\Invoice;

class XeroServiceProvider extends ServiceProvider
{
    private $config = 'xero/config.php';

    public function boot()
    {
        $this->publishes([
            __DIR__.'/../config.php' => config_path($this->config),
        ]);
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('XeroInvoice', function(){
           //return new \XeroPHP\Models\Accounting\Invoice();
           return new Invoice();
        });

    }
}
2个回答

31

运行 php artisan make:provider ExtendedXeroServiceProvider

将其添加到./config/app.phpproviders

打开./app/Providers/ExtendedXeroServiceProvider.php

extends ServiceProvider改为extends XeroServiceProvider

同时添加use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider

将原始服务提供程序添加到./composer.json中的发现黑名单中

编辑

截至撰写本文时,drawmyattention/xerolaravel包不使用自动发现,但如果使用,则可以将其添加到composer.json中:

"extra": {
    "laravel": {
        "dont-discover": [
            "drawmyattention/xerolaravel"
        ]
    }
},

好的...除了发现黑名单部分,其他我都明白了...那我应该添加什么? - user3574492
(因为如果该软件包正在使用自动发现功能,它将同时尝试加载正常版本和您扩展的版本,因此在这种情况下,您需要将其列入黑名单,但这是另一个软件包的故事 :)) - Quezler
2
运行得非常出色。谢谢。 - user3574492
1
这里是关于“dont-discover”的文档:https://laravel.com/docs/5.8/packages#package-discovery - Ryan
好的,应该放入的不是提供程序的名称,而是包的名称,可以在文档中看到,已编辑答案。 - Tofandel
显示剩余2条评论

0

基于@Quezler的答案

  1. 我尝试使用命名空间添加提供者(类),然后运行composer dump-autoload,但没有成功

  2. 我尝试添加第三方包(名称),然后运行composer dump-autoload,这样就成功了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接