一、前言
TP 6 文档很简洁,很多内容都没有给出一个残缺的例子,事件
这块内容亦是如此,感觉对老手不是很敌对。
二、博客浏览量的例子
(一)后期筹备:
1. 定义路由
Route::get('blogs/:id','Blogs/read');
2. 创立控制器
应用命令
php think make:controller Blogs
3. 创立模型
应用命令
php think make:model Blog
4. 创立 think_blog 表
CREATE TABLE `think_blog` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` varchar(255) NOT NULL, `views` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
表如下所示:
5. 模型和控制器的代码
Blogs
控制器,引入 Blog
模型类和定义了 read
办法:
<?phpdeclare (strict_types = 1);namespace app\controller;use think\Request;use app\model\Blog;use app\handlers\JsonResponseHandler;class Blogs{ /** * 显示指定的资源 * * @param int $id * @return \think\Response */ public function read($id) { $blog = Blog::findOrEmpty($id); if($blog->isEmpty()){ return JsonResponseHandler::error('博客不存在'); } $data = [ 'title' => $blog->title, 'content' => $blog->content, 'views' => $blog->views ]; return JsonResponseHandler::succ('查问胜利',$data); }}
Blog
模型代码:
<?phpdeclare (strict_types = 1);namespace app\model;use think\Model;/** * @mixin \think\Model */class Blog extends Model{ protected $name = 'think_blog';}
(二)事件
1. 定义事件
应用命令行
php think make:event BlogView
默认会生成一个 app\event\BlogView
事件类,批改该类,代码如下:
<?phpdeclare (strict_types = 1);namespace app\event;// 引入 Blog 模型use app\model\Blog;class BlogView{ public $blog; public function __construct(Blog $blog) { $this->blog = $blog; }}
2. 绑定事件
在利用的 event.php
事件定义文件中批量绑定。
event.php
文件在 app
目录下,绑定事件的代码如下:
<?php// 事件定义文件return [ 'bind' => [ 'BlogView' => 'app\event\BlogView', ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], ], 'subscribe' => [ ],];
3. 事件监听
应用命令行生成事件监听类:
php think make:listener BlogView
定义事件监听解决
<?phpdeclare (strict_types = 1);namespace app\listener;class BlogView{ /** * 事件监听解决 * * @return mixed */ public function handle($BlogView) { // 当事件触发后,浏览量+1,并更新数据库外面的数据 $blog = $BlogView->blog; $id = $blog->id; $views = $blog->views; $blog::update(['views'=>$views+1],['id'=>$id]); }}
4. 绑定监听
在之前提到的 event.php
文件中进行绑定,具体代码如下:
<?php// 事件定义文件return [ 'bind' => [ 'BlogView' => 'app\event\BlogView', ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], // 绑定监听 'BlogView' => ['app\listener\BlogView'], ], 'subscribe' => [ ],];
5. 触发事件
当用户浏览博客的时候,浏览量加一,所以触发机会应该定义在 Blogs
控制器中的 read
办法,留神读正文:
<?phpdeclare (strict_types = 1);namespace app\controller;use think\Request;use app\model\Blog;// 引入 BlogView 事件use app\event\BlogView;use app\handlers\JsonResponseHandler;class Blogs{ /** * 显示指定的资源 * * @param int $id * @return \think\Response */ public function read($id) { $blog = Blog::findOrEmpty($id); if($blog->isEmpty()){ return JsonResponseHandler::error('博客不存在'); } // 触发事件 event(new BlogView($blog)); $data = [ 'title' => $blog->title, 'content' => $blog->content, 'views' => $blog->views ]; return JsonResponseHandler::succ('查问胜利',$data); }}
6. 测试
查问前 id
为 3 的文章的浏览数为零
查问
查问后
参考资料
- TP6 文档-事件