如何在laravel 5.8应用程序中扩展laravel软件包?

时间:2019-05-03 12:53:36

标签: laravel-5 package

我是Laravel的新手,希望能帮助您描述如何扩展供应商文件夹中的Laravel软件包,并且在更新软件包时不会受到影响。

1 个答案:

答案 0 :(得分:0)

我将尝试创建一个简要指南,如有需要,我们将进行扩展。

我建议将所有文件放在单独的目录/名称空间中。如果您以后决定创建自己的作曲家程序包,将会从中受益。

作为示例,我将扩展bumbummen99/shoppingcart软件包,该软件包派生了出色的gloudemans/shoppingcart,增加了对Laravel 5.8的支持和一些次要功能。当然,您首先需要安装该软件包:

composer require bumbummen99/shoppingcart
  • 首先创建几个文件夹。您可以为文件夹/类使用任何名称,这是我使用的相对于项目根目录的名称:

app/Repositories/ExtendedCart
app/Repositories/ExtendedCart/Facades

  • 创建文件

app/Repositories/ExtendedCart/ExtendedCart.php

此类将扩展包的主类:

namespace App\Repositories\ExtendedCart;

use Gloudemans\Shoppingcart\Cart;

class ExtendedCart extends Cart
{
    public function myMethod(){
        return 'myMethod';
    }
}
  • 然后建立您的服务提供商。创建文件:

app/Repositories/ExtendedCart/ExtendedCartServiceProvider.php
(我没有使用artisan,因为生成/移动提供程序将产生错误的名称空间)

这是您的服务提供商的内容,在这里您引用了扩展包类的类。请注意,您将覆盖原始程序包中的绑定。

namespace App\Repositories\ExtendedCart;

use Gloudemans\Shoppingcart\ShoppingcartServiceProvider;

class ExtendedCartServiceProvider extends ShoppingcartServiceProvider
{
    public function register()
    {
        $this->app->bind('cart', 'App\Repositories\ExtendedCart\ExtendedCart');
    }

}

然后在config / app.php中注册您的服务提供商

'providers' => [

    ...

    //Add this line to the end of providers array
    App\Repositories\ExtendedCart\ExtendedCartServiceProvider::class,
]
  • 最后创建一个Facade,该实例将实例化该类(否则,您将获得非静态方法异常)。创建此文件:

app /存储库/ExtendedCart/Facades/ExtendedCart.php

这是文件的内容:

namespace App\Repositories\ExtendedCart\Facades;

use Illuminate\Support\Facades\Facade;

class ExtendedCart extends Facade {
    protected static function getFacadeAccessor() { return 'cart'; }
}

您都准备使用扩展方法。您可以安全地升级原始软件包,甚至可以使用默认外观:

namespace App\Http\Controllers;

use Cart;

class SomeController extends Controller{

    public function someFunction(){
        Cart::instance('default')->myMethod();
        //This should return 'myMethod'

    }
}

我希望这会有所帮助,祝你好运!