一、前言

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 的文章的浏览数为零

查问

查问后

参考资料

  1. TP6 文档-事件