laravel 观察者模式
2019年4月23日1.创建观察者文件
1 |
php artisan make:observer TopicObserver |
2.将观察者文件和模型绑定,(这里我就不创建模型了)
\app\Providers\AppServiceProvider.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Providers; use Carbon\Carbon; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * 启动自运行 */ public function boot() { Carbon::setLocale('zh'); #将时间戳改为中文 \App\Models\Topic::observe(\App\Observers\TopicObserver::class); #观察者模式 } . . . |
3.编辑观察者文件
\app\Observers\TopicObserver.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<?php namespace App\Observers; use App\Models\Topic; use App\Jobs\TranslateSlug; /** * Class TopicObserver * @package App\Observers * creating, created, updating, updated, saving, * saved, deleting, deleted, restoring, restored */ class TopicObserver { /** * 模型观察器在 Topic 模型保存时触发的 saving 事件中,对 excerpt 字段进行赋值: * 这里还没有创建成功, * @param Topic $topic */ public function saving(Topic $topic) { $topic->body = clean($topic->body, 'user_topic_body'); #防止xss攻击 $topic->excerpt = make_excerpt($topic->body); #摘要截取 } /** * 这里代表创建成功,会有id,放在这里才能更新成功 * @param Topic $topic */ public function saved(Topic $topic) { #如 slug 字段无内容,即使用翻译器对 title 进行翻译 if (!$topic->slug) { dispatch(new TranslateSlug($topic)); #使用队列翻译 } } /** * 如果文章删除了,那么评论也要跟随删除 * @param Topic $topic */ public function deleted(Topic $topic) { \DB::table('replies')->where('topic_id', $topic->id)->delete(); } } |
4.这里主要介绍一下方法
1 2 3 4 5 6 7 8 9 10 11 |
retrieved, #获取到模型实例后触发 creating, #创建过程前 * 常用 created, #创建成功后 * 常用 updating, #更新过程前 * 常用 updated, #更新成功后 * 常用 saving, #代表这两个方法的集合creating,updating * 常用 saved, #代表这两个方法的集合created,updated * 常用 deleting, #删除过程前 * 常用 deleted, #删除过程后 * 常用 restoring, #恢复软删除记录前触发 restored, #恢复软删除记录后触发 |