资讯专栏INFORMATION COLUMN

Laravel 5.1 事件、事件监听的简单应用

TIGERB / 2666人阅读

摘要:下面就事件事件监听举一个很简单的例子你就会发现。定义监听器事件监听器在方法中接收事件实例,命令将会自动在方法中导入合适的事件类和类型提示事件。

​ 有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过。下面就事件、事件监听举一个很简单的例子你就会发现。

​ 这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听机制在 Laravel 中是通过观察者模式实现的.

注册事件以及监听器

首先我们需要在 app/Providers/目录下的EventServiceProvider.php中注册事件监听器映射关系,如下:

protected $listen = [
        "AppEventsBlogView" => [
            "AppListenersBlogViewListener",
        ],
    ];

然后项目根目录下执行如下命令

php artisan event:generate

该命令完成后,会分别自动在 app/Eventsapp/Listensers目录下生成 BlogView.phpBlogViewListener.php文件。

定义事件
post = $post;
    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return [];
    }
}

其实看到这些你会发现该事件类只是注入了一个 Post实例罢了,并没有包含多余的逻辑。

定义监听器

事件监听器在handle方法中接收事件实例,event:generate命令将会自动在handle方法中导入合适的事件类和类型提示事件。在handle方法内,你可以执行任何需要的逻辑以响应事件,我们的代码实现如下:

session = $session;
    }

    /**
     * Handle the event.
     *
     * @param  BlogView  $event
     * @return void
     */
    public function handle(BlogView $event)
    {
        $post = $event->post;
          //先进行判断是否已经查看过
        if (!$this->hasViewedBlog($post)) {
              //保存到数据库
            $post->view_cache = $post->view_cache + 1;
            $post->save();
              //看过之后将保存到 Session 
            $this->storeViewedBlog($post);
        }
    }

    protected function hasViewedBlog($post)
    {
        return array_key_exists($post->id, $this->getViewedBlogs());
    }

    protected function getViewedBlogs()
    {
        return $this->session->get("viewed_Blogs", []);
    }

    protected function storeViewedBlog($post)
    {
        $key = "viewed_Blogs.".$post->id;

        $this->session->put($key, time());
    }

}

注释中也已经说明了一些逻辑。

触发事件

事件和事件监听完成后,我们要做的就是实现整个监听,即触发用户打开文章事件在此我们使用和 Event提供的 fire方法,如下:

firstOrFail();
        Event::fire(new BlogView($post));
        return view("home.blog.content")->withPost($post);
    }

}

现在打开页面发现数据库中的 view_cache 已经正常加1了,这样整个就完成了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21232.html

相关文章

  • [译] Laravel 5 之美 - 单元测试

    摘要:事实上,这是讨论测试的惟一一章。因此,在中没有单一的测试方法。包含了这是的标准强调业务或特性测试是最流行的框架。然后我们在这个项目中使用进行单元测试。在随后的章节中,将不再进行测试。 原文地址: Laravel 5.1 Beauty - Testing Note 本系列第四节内容. 本章会创建一个以后可以用到的项目便于以后我们的课程使用, 同时也会查课各种测试选项. 以后一段时间内会开...

    fuyi501 评论0 收藏0
  • Laravel 动态添加 Artisan 命令最佳实践

    摘要:初步尝试既然最常见的注册命令的方式是修改类中的,那么一般正常人都会从这边开始下手。又要自己取出实例,又要自己调用方法,调用方法之前还有自己先把实例化这么繁琐,肯定不是运行时添加命令的最佳实践,所以我决定继续寻找更优解。 本文首发于我的博客,原文链接:https://blessing.studio/best-... 虽然 Laravel 官方文档提供的添加 Artisan Command...

    ninefive 评论0 收藏0
  • [Laravel 5.3] Notification 个人理解,及 BearyChat Channe

    摘要:提供了一种全新的发送通知的方式。个人理解是可以基于某事件操作触发一系列的通知任务,而通知方式由通知渠道接管,这样使得通知或推送逻辑更抽象,更易于管理和重构。在之前,我是利用的来完成这一系列通知。使用的配置文件还是原来的,无需重新配置。 Laravel Notification Laravel 5.3 提供了一种全新的发送通知的方式:Notification 。个人理解是可以基于某事件(...

    Yang_River 评论0 收藏0
  • LaravelLaravel 框架关键技术解析·读书笔记(二)

    摘要:框架关键技术解析读书笔记二第五章框架应用程序根目录版本默认的框架应用程序是符合规范的,所以相应的目录结构也是基本固定的,不同的目录加载了功能文件,如果添加了新的目录,需要在文件中添加规范的自动加载部分并执行命令。 Laravel 框架关键技术解析·读书笔记(二) 第五章 框架应用程序根目录(5.1版本) 默认的Laravel框架应用程序是符合PSR规范的,所以相应的目录结构也是基本...

    TIGERB 评论0 收藏0
  • Laravel核心解读 -- 事件系统

    摘要:对于包含通配符的事件名,会被统一放入数组中,是用来创建事件对应的的如果是监听器是类,去创建监听类创建的时候,会判断监听对象是监听类还是闭包函数。对于闭包监听来说,会再包装一层返回一个闭包函数作为事件的监听者。 事件系统 Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件。事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器。lar...

    chengjianhua 评论0 收藏0

发表评论

0条评论

TIGERB

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<