Laravel5.6中event事件的使用

本文介绍了Laravel 5.6中的事件系统,包括事件注册、监听器生成及事件分发。通过事件,可以降低代码耦合,提高代码可读性。在`EventServiceProvider`中声明事件和监听器的关联,使用Artisan命令生成事件和监听器类,最后通过`event`辅助函数触发事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Laravel 事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。事件类通常存放在 app/Events 目录,监听器存放在 app/Listeners。如果你在应用中没有看到这些目录,不要担心,它们会在你使用 Artisan 命令生成事件和监听器的时候自动创建。

简单的说下自己的理解

事件是一个工具,使用之后可以将逻辑变得清晰,降低代码的耦合,使用场景例如游戏中的请求发货,发邮件等,下面是主要是根据laravel文档来讲述整个流程

1 注册事件/监听器

首先在lapp/Providers/EventServiceProvider.php文件中去声明调用事件时会被谁监听到,也就是建立事件与监听者的关系,原始文件如下

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\Event' => [
            'App\Listeners\EventListener',
        ],
        
        //举例 发邮件事件
        'App\Events\sendMail' => [			//你的事件
            'App\Listeners\SendMailEventListener',    //监听器
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();

        //
    }
}

2 生成事件/监听器类

执行命令生成event事件和监听器,不必担心事件重复执行命令会重复创建事件

php artisan event:generate

生成的事件在app\Events\SendMail.php目录下,监听器在app\Listeners\SendMailEventListener.php

SendMail.php

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class SendMail
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($email)
    {
        $this->email = $email;   //实例化的时候传参
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

SendMailEventListener.php

<?php

namespace App\Listeners;

use App\Events\SendMail;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendMailEventListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  SendMail  $event
     * @return void
     */
    public function handle(SendMail $event)
    {
    	//具体方法逻辑的实现
        $email = $event->email;

		//如果你希望停止事件被传播到其他监听器,可以返回false实现
		return false;
    }
}

3 分发事件

以上我们事件的逻辑已经处理好了,接下来要做的就是触发事件,使用event辅助函数

<?php

namespace App\Http\Controllers;

use App\Order;
use App\Events\SendMail;
use App\Http\Controllers\Controller;

class OrderController extends Controller
{
    /**
     *
     * @return Response
     */
    public function ship($email)
    {
        // 发邮件逻辑
        event(new SendMail($email));
    }
}

总结

以上就是一个最简单的事件的创建和使用,如果想看完整的事件教程还是建议大家去看手册,事件的使用其实也挺适合多人开发的,如果一块逻辑包含很多个事件,多人维护的成本是比较大的,我们可以通过看事件以及监听器的逻辑就能理解一个需求,而不一定要去看Controller或者Service。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值