php - 如何使用 Laravel 为每个模型实例注册默认观察者

标签 php laravel laravel-5.1

拉拉维尔 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/

相关文章:

javascript - 在 MySQL 查询中使用 javascript run select 选项

php - 数字的 Laravel 规则验证

php - 在 Views laravel 上使用 carbon

php - RouteCollection.php 中的 MethodNotAllowedHttpException 第 200 行 :

laravel - 如何在 Laravel 5 中保护图像不被公众看到?

mysql - Laravel:未找到基表或 View :1146 表不存在

php - GROUP BY 子句忽略行和数据

php - 从插入行查询返回列条目 - MySQL 和 PHP

php - Laravel Eloquent 按关系表列排序

laravel - 扩展 Laravel Eloquent\Collection 类