有时候感叹,智商真是有限,好在感叹还不至于那么频繁。

学习

忙里偷闲,学习了一下 laravel 的 Event (via),简单的说,逻辑就是在代码里使用 event()触发事件,然后事件触发监听器,好处在于一个事件可以触发多个监听器。例如本次测试代码:

1
2
3
4
5
6
7
8
9
protected $listen = [
        'App\Events\Event' => [
            'App\Listeners\EventListener',
        ],
        'App\Events\ArticleSaved' => [
            'App\Listeners\BackupArticle',
            \App\Listeners\LogTest::class,
        ],
    ];

在 Eloquent 中也可以使用 Event (via),分别在curd不同的时候触发事件,不过目前不知道怎么直接在事件中,获取到更改之前的数据。

监听器还可以直接使用队列运行(via),非常方便,不过要先配置好队列。

还有 Event Subscribers,是一种用来在单个监听器文件中,处理多个事件的方式。

总之,监控器和事件,是可以多对多的。

实践

这次给博客增加的功能,是要实现文章的历史记录,不过由于没找到 model 触发事件时,怎么传未修改的值,现在历史表中也会保存最新的文章版本。

这个功能就使用了 Eloquent 中的 saved 事件:

1
2
3
	protected $events = [
	    'saved' => ArticleSaved::class,
    ];

然后在ArticleSaved事件中注入一个Article Model:

1
2
3
4
    public function __construct(Article $article)
    {
        $this->article = $article;
    }

最后,在BackupArticle监听器中,实现备份:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    public function handle(ArticleSaved $event)
    {
        $article = $event->article;

        $articleHistory = new ArticleHistory($article->toArray());

        $articleHistory->created_at = $article->updated_at;

        $articleHistory->save();
    }

然后,就大功告成啦~