如何将模型绑定到laravel中的另一个模型
问题描述:
某些软件包会预先打包自己的模型。 Cart
但有时我想一些额外的逻辑添加到模型,如何将模型绑定到laravel中的另一个模型
所以不是编辑原始模型或在使用这个模型,并用新创建的一个替换它到处寻找,
我想我会使用app bind ex。
// model
<?php
namespace App\Binders;
use some\package\Models\Cart;
class CartBinder extends Cart
{
// extra logic
}
// [email protected]
$this->app->bind('some\package\Models\Cart', 'App\Binders\CartBinder');
但遗憾的是这没有任何影响&我不知道我错过了:(。
答
我会建议你使用装饰Decorator模式的典范。 杰夫方式具有良好的系列Design Patterns 或查看decorator pattern example 它可以沿直线走:
<?php
namespace App\Binders;
use some\Package\Models\Cart;
class CartBinder
{
protected $cart;
public function __contruct(Cart $cart)
{
$this->cart = $cart;
}
// the extra logic
}
那么你就可以绑定在服务容器的依赖关系。
$this->app->bind('App\Binders\CartBinder', function ($app) {
return new \App\Binders\CartBinder(new some\Package\Models\Cart);
});
从那里你可以解决它,实例化的地方在你的代码(控制器,模型......)这样说:
$cart = $this->app->make('App\Binders\CartBinder');
或者你可以在你的控制器的方法注入。
// use App\Binders\CartBinder;
// ...
public function store(CartBinder $cart)
{
// ...
}
但是,laravel如何知道我想使用这个模型而不是原来的'some \ Package \ Models \ Cart'? – ctf0
问题标题是“如何将模型绑定到另一个模型”而不是如何构建新的实现。 – ctf0
@ ctf0我的方法只是为了使其工作而必须采取的步骤的完整说明。您可以在Laravel 5.4上查看关于模型绑定的文档。 https://laravel.com/docs/5.4/container#binding 扩展需要绑定的模型不会使其工作。您必须传递模型以在构造函数中进行绑定。 –