拉拉维尔 5.1
我正在尝试为每个扩展我的 AbstractModel(扩展 Illuminate\Database\Eloquent\Model)的模型注册一个模型观察者。
问题是我的 GenericModelObserver 无法监听由继承 AbstractModel 的模型触发的事件。
让我展示一下到目前为止我做了什么。
创建了一个服务提供者,并将其放在 config/app.php 中提供者数组的最后位置
<?php
// app/Providers/ObserverServiceProvider.php
namespace App\Providers;
use App\Models\Quotation;
use App\Models\AbstractModel;
use App\Observers\QuotationObserver;
use App\Observers\GenericModelObserver;
use Illuminate\Support\ServiceProvider;
class ObserverServiceProvider extends ServiceProvider
{
public function boot()
{
AbstractModel::observe(GenericModelObserver::class);
Quotation::observe(QuotationObserver::class);
}
public function register()
{
}
}
然后我有了简单的 GenericModelObserver
<?php
// app/Observers/GenericModelObserver.php
namespace App\Observers;
use App\Models\AbstractModel;
class GenericModelObserver
{
public function saving(AbstractModel $model)
{
return $model->valid();
}
}
抽象模型
<?php
// app/Models/AbstractModel.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class AbstractModel extends Model
{
// ...
}
我的报价模型
<?php
// app/Models/Quotation.php
namespace App\Models;
class Quotation extends AbstractModel
{
// ...
}
保存报价时,GenericModelObserver 无法监听保存事件或任何其他事件。
这同样适用于没有特定模型观察者的其他模型。
这是正确的策略吗?我不想通过引导方法将观察者绑定(bind)到每个模型。
最佳答案
而不是扩展模型 - 编写你自己的特征,它将作为观察者工作。
下面我写了一些基本特征:
<?php
namespace App\YourPackage\Traits;
use Illuminate\Database\Eloquent\Model;
trait Observable
{
public static function bootObservable()
{
static::updating(function (Model $model) {
dd('updating');
});
}
}
并通过在模型类中键入 use Observable;
来使用它。
另外,为了您的学习,请注意 traits 是如何启动的:您必须将 boot[TraitClassName]
方法放入 trait 中,才能正确启动它。
切勿在特征中编写 boot
方法,这很危险!
关于php - 如何使用 Laravel 为每个模型实例注册默认观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36501652/