首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel多模型事件

Laravel多模型事件
EN

Stack Overflow用户
提问于 2016-06-03 10:33:13
回答 2查看 4.1K关注 0票数 10

我正在尝试将我的数据库与外部服务同步。

我在跨web应用程序的几个地方使用Algolia搜索。

它是用几个模型建立索引的,但是,我需要它在数据库发生任何更改时重新索引,即当触发多个模型事件时。

我的第一种方法是在AppServiceProvider引导方法中执行所有操作。

代码语言:javascript
复制
public function boot()
{
    $events = ['created', 'updated', 'deleted', 'restored'];

    // reindex handlers for models relevant to Algolia search
    foreach ($events as $evt) {
        Order::registerModelEvent($evt, function () {
            Order::reindex();
        });
        Product::registerModelEvent($evt, function () {
            Product::reindex();
            Product::setSettings();
        });
    }
}

这是我避免使用文档中示例的标准模型函数的多个条件的方法。

不过,我假设有更好的方法使用Laravel事件侦听器。

代码语言:javascript
复制
namespace App\Listeners;

class OrderEventListener
{
    // handlers

    public function subscribe($events)
    {
        $events->listen(
            // model events
        );
    }
}

虽然我不知道如何利用listen方法中的模型事件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-06 21:30:34

我强烈建议为这种情况添加您自己的事件和处理程序。

ProductOrder类中,您可以重写模型的boot方法:

代码语言:javascript
复制
class Product extends Model
{
    protected static function boot()
    {
        parent::boot();

        self::created(function($product) {
            event(new ProductCreatedEvent($product));
        });
    }
}

您需要创建自己的ProductCreatedEvent对象。现在,在EventServiceProvider中,您需要添加到侦听器数组中;

代码语言:javascript
复制
protected $listeners = [
    'App\Events\ProductCreatedEvent' => [
        'App\Listeners\UpdateAlgoliaProductIndex',
    ]
];

设置好之后,您可以实际运行php artisan event:generate,这将为您创建事件对象和侦听器。我将跳过事件对象,因为它非常简单,它只接受所创建的产品并将其发送到UpdateAlgoliaProductIndex侦听器。

现在,在您的侦听器中,您将得到如下内容:

代码语言:javascript
复制
class UpdateAlgoliaProductIndex
{
    public function handle($event)
    {
        Product::reindex();
        Product::setSettings();
    }
}

我建议采用这种方法的原因是,您可以使用ShouldQueue接口对侦听器进行排队,这意味着您不会在等待应用程序使用Algolia重新索引时阻止请求,从而为用户带来更好的体验。

您可以阅读更多关于事件对象和侦听器这里的信息。

另一种选择是使用模型观测器

票数 8
EN

Stack Overflow用户

发布于 2016-06-09 10:30:16

通过一些挖掘,我遇到了Laravel 订户,它更类似于我正在寻找的东西,所以我提交了它作为自己的答案。

我认为这会产生比每个事件都有侦听器更简洁的代码。

代码语言:javascript
复制
namespace App\Listeners;

use App\Events\OrderCreatedEvent;
use App\Events\OrderUpdatedEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class OrderEventListener
{
    /**
     * Handle order created events.
     *
     * @param OrderCreatedEvent $event
     */
    public function onOrderCreation(OrderCreatedEvent $event)
    {
        // do something
    }

    /**
     * Handle order updated events.
     *
     * @param OrderUpdatedEvent $event
     */
    public function onOrderUpdate(OrderUpdatedEvent $event)
    {
        // do something
    }

    /**
     * Register the listeners for the subscriber.
     *
     * @param $events
     */
    public function subscribe($events)
    {
        $events->listen(
            'App\Events\OrderCreatedEvent',
            'App\Listeners\OrderEventListener@onOrderCreation'
        );

        $events->listen(
            'App\Events\OrderUpdatedEvent',
            'App\Listeners\OrderEventListener@onOrderUpdate'
        );
    }
}

我将保持marcus.ramsden答案的标记,但这可能与遇到这个问题的人非常相关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37612058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档