Laravel7.15.0学习中遇到的坑—事件

前言:

最近在学习 laravel 框架,学习的版本是 7.15.0 ,记录一下学习过程中遇到的问题和难点以及一些总结。

注册事件/监听器

事件类通常存放在 app/Events 目录,监听器存放在 app/Listeners,初始化框架的时候这些目录并不存在,在服务提供者中 EventServiceProvider 中创建事件,运行 Artisan 命令会自动生成事件和监听器所在的目录。
在 App/Providers/EventServiceProvider.php 中添加一个新的 listen 属性包含了事件(键)和对应监听器(值)数组。

    /**
     * 应用的事件监听器映射
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        //添加测试的应用的事件监听器映射
        'App\Events\TestEvent' => [
            'App\Listeners\TestListener',
        ],
    ];
生成事件/监听器类

在终端中运行如下命令可以直接生成事件和监听器。已经存在的不会再重复生成。

php artisan event:generate

在项目中会自动生成文件和所在的目录 Events、Listeners。
在这里插入图片描述

实际使用

在 TestEvent.php 进行定义事件。
这里用的是调用一个 AdminModel 类,进行查询 admin 用户表中的数据。

<?php
namespace App\Events;
use App\Http\Model\Admin\AdminModel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class TestEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    /**
     * @var AdminModel
     */
    private $admin;
    /**
     * 构造方法类
     * @return void
     */
    public function __construct(AdminModel $admin)
    {
        $this->admin = $admin;
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
    /**
     * @return mixed
     */
    public function getUserOne()
    {
        return $this->admin->first();
    }
    /**
     * @return mixed
     */
    public function getUserTwo()
    {
        return $this->admin->limit(2)->get();
    }
}

在 TestListener.php 进行事件监听。

<?php
namespace App\Listeners;
use App\Events\TestEvent;
class TestListener
{
    /**
     * Create the event listener.
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * 处理事件监听,依赖注入的方式,注入任何你需要的类。
     * @param  Test  $event
     * @return void
     */
    public function handle(TestEvent $event)
    {
        //调用事件Event中的方法
//        return $event->getUserOne();
        return $event->getUserTwo();
        //return true;//false 可以阻止事件继续传播
    }
}

在控制器中实际使用,直接调用事件 TestEvent。

<?php
namespace App\Http\Controllers;
use App\Events\TestEvent;
use App\Http\Model\Admin\AdminModel;
use Illuminate\Routing\Controller as BaseController;
class TestEventController extends BaseController
{
    public function action(AdminModel $admin)
    {
    	//调用 TestEvent 中的事件监听方法,触发事件定义-》监听-》执行
        $data = event(new TestEvent($admin));
        return response()->json(['code'=>1,'data'=>$data]);
    }
}

这只是一个事件从定义到监听再到事件使用中的小例子,在后续的项目开发中如果用到再继续深入的学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值