我是 Laravel 的新手,如果我更新包,我将不胜感激描述如何扩展位于供应商文件夹中的 Laravel 包并且不会受到影响的任何帮助。
1 回答
我将尝试创建一个简短的指南,如果需要,我们将进行扩展。
我建议将所有文件放在单独的目录/命名空间中。如果您以后决定创建自己的作曲家包,您将从中受益。
作为一个例子,我将扩展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
(我没有使用工匠,因为生成/移动提供者会产生错误的命名空间)
这是您的服务提供者内容,在这里您引用扩展包类的类。请注意,您会覆盖原始包中的绑定。
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,它将实例化该类(否则您将获得非静态方法异常)。创建这个文件:
应用程序/存储库/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'
}
}
我希望这会有所帮助,祝你好运!