Laravel 5.1中定义事件、事件监听器以及触发事件例子
发布:smiling 来源: PHP粉丝网 添加日期:2018-09-14 13:32:19 浏览: 评论:0
这里我们基于之前基于模型+缓存对文章增删改查这篇文件对文章保存后缓存的处理做进一步优化。我们将文章保存(新建/修改)视为一个事件,将保存文章内容到缓存放到监听器中实现:
1、注册事件-监听器
首先我们需要在EventServiceProvider中注册事件与监听器之间的映射关系:
- protected $listen = [
- 'App\Events\PostSaved'=>[
- 'App\Listeners\SaveDataToCache'
- ]<br>
- ];
然后我们在项目根目录运行如下Artisan命令:
php artisan event:generate
该命令会在app/Events目录下生成PostSaved.php,在app/Listeners目录下生成SaveDataToCache.php。
2、定义事件类
接下来我们编辑事件类PostSaved如下:
- <?php
- namespace App\Events;
- use App\Events\Event;
- use App\Models\Post;
- use Illuminate\Queue\SerializesModels;
- use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
- class PostSaved extends Event
- {
- use SerializesModels;
- /**
- * Create a new event instance.
- *
- * @return void
- */
- public function __construct(Post $post)
- {
- $this->post = $post;
- }
- /**
- * Get the channels the event should be broadcast on.
- *
- * @return array
- */
- public function broadcastOn()
- {
- return [];
- }
- }
我们在构造函数中注入一个Post实例传递给PostSaved。
3、定义监听器类
然后我们来定义监听器类SaveDataToCache,监听器类中使用handle方法接收事件实例并执行响应该事件的业务逻辑,这里就是将就接收到的Post实例保存到缓存中:
- <?php
- namespace App\Listeners;
- use App\Events\PostSaved;
- use Cache;
- use Log;
- use Illuminate\Queue\InteractsWithQueue;
- use Illuminate\Contracts\Queue\ShouldQueue;
- class SaveDataToCache
- {
- /**
- * Create the event listener.
- *
- * @return void
- */
- public function __construct()
- {
- //
- }
- /**
- * Handle the event.
- *
- * @param PostSaved $event
- * @return void
- */
- public function handle(PostSaved $event)
- {
- $post = $event->post;
- $key = 'post_'.$post->id;
- Cache::put($key,$post,60*24*7);
- Log::info('保存文章到缓存成功!',['id'=>$post->id,'title'=>$post->title]);
- }
- }
业务逻辑很简单:从注入的PostSaved中获取文章实例并将其保存到缓存,并将该操作记录到日志。
4、触发事件
最后我们来测试文章保存事件及其监听器。
要触发文章保存事件,可以使用Event门面提供的fire方法,在PostController中修改store方法如下:
- public function store(Request $request)
- {
- $title = $request->input('title');
- $content = $request->input('content');
- $post = new Post;
- $post->title = $title;
- $post->content = $content;
- $post->save();
- Event::fire(new PostSaved($post));
- return redirect()->route('post.show',['post'=>$post]);
- }
然后修改update方法如下:
- public function update(Request $request, $id)
- {
- $post = Post::find($id);
- if(!$post)
- exit('指定文章不存在!');
- $title = $request->input('title');
- $content = $request->input('content');
- $post->title = $title;
- $post->content = $content;
- $post->save();
- Event::fire(new PostSaved($post));
- return redirect()->route('post.show',['post'=>$post]);
- }
在浏览器中访问http://laravel.app:8000/post/create,填写标题和文章内容:
点击提交页面跳转到文章详情页,此时去查看日志storage/logs/laravel.log,可以看到对应日志记录:
[2015-11-10 23:14:12] local.INFO: 保存文章到缓存成功! {"id":13,"title":"Test Event Add"}
说明已触发文章保存事件,监听器监听到事件后将其保存到缓存中并记录日志。
Tags: 事件 监听器 例子
相关文章
- ·php实现事件监听与触发实例程序(2014-08-27)
- ·php微信开发之关注事件(2018-11-14)
- ·swoole事件处理流程(2020-04-06)
- ·php实现监听事件(2020-05-16)
- ·php实现事件监听与触发的方法(2021-04-27)
- ·PHP实现事件机制实例分析(2021-06-05)
- ·Laravel框架实现利用监听器进行sql语句记录功能(2018-11-07)
- ·PHP实现一个双向队列例子(2014-06-08)
- ·php Flyweight享元模式使用例子(2014-06-10)
- ·php多进程几个例子(2014-06-17)
- ·php计划任务的实现例子介绍(2014-06-18)
- ·PHPMailer实现邮件发送例子(2014-06-20)
- ·PHP中Soap模块安装与使用例子(2014-06-20)
- ·php中Curl函数常用的两个例子,登陆/soap(2014-08-27)
- ·php中curl get/post 例子 (包括https协议)(2014-09-12)
- ·PHP多线程pthreads使用例子(2015-12-24)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)