首页 > 其他分享 >25. Laravel 事件

25. Laravel 事件

时间:2023-02-28 13:58:09浏览次数:46  
标签:Laravel 25 function App 事件 监听器 event listen

Laravel 事件

配套视频地址:https://www.bilibili.com/video/av77534496

目的:解耦。

简介:监听器监听到事件的发生,会执行 handler 方法。

// 原始代码
public function register(){
    // 注册用户
    // 成功后发送欢迎的信息通知
}


// 事件解耦后
public function register(){
    // 注册用户
    event('App\Events\RegisterOk');
}

注册事件和监听器

# EventServiceProvider 
protected $listen = [
    'App\Events\OrderShipped' => [
        'App\Listeners\SendShipmentNotification',
    ],
];


# 在 boot 方法里,以闭包方式注册

//触发事件调用
event('event.name', $user);
//以下放boot方法里
Event::listen('event.name', function ($user) {

});
# 通配符
Event::listen('event.*', function ($eventName, array $data) {
    //
});



// 配置自动发现后可以不注册了,Laravel 会自动扫描目录。
# EventServiceProvider
public function shouldDiscoverEvents()
{
    return true;
}
// 配置自动扫描的目录
protected function discoverEventsWithin()
{
    return [
        $this->app->path('Listeners'),
    ];
}
php artisan event:generate
// 避免手动建立事件类、监听器类,根据你在 
`EventServiceProvider` 里 `$listen` 自动生成
// 生产环境避免每次请求扫描目录
php artisan event:cache
php artisan event:clear

定义事件

<?php

namespace App\Events;

use App\Order;
use Illuminate\Queue\SerializesModels;

class OrderShipped
{
    use SerializesModels;

    public $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }
}

定义监听器

<?php

namespace App\Listeners;

use App\Events\OrderShipped;

class SendShipmentNotification
{
    public function __construct()
    {
        //
    }

    public function handle(OrderShipped $event)
    {
        // Access the order using $event->order...
        // 想禁止冒泡,请 return false
    }
}

分发事件

$order = Order::findOrFail($orderId);
event(new OrderShipped($order));

事件订阅器

实现了在单个类中包含多个监听器。

<?php

namespace App\Listeners;

class UserEventSubscriber
{
    /**
     * Handle user login events.
     */
    public function handleUserLogin($event) {}

    /**
     * Handle user logout events.
     */
    public function handleUserLogout($event) {}

    /**
     * Register the listeners for the subscriber.
     *
     * @param  \Illuminate\Events\Dispatcher  $events
     */
    public function subscribe($events)
    {
        $events->listen(
            'Illuminate\Auth\Events\Login',
            'App\Listeners\UserEventSubscriber@handleUserLogin'
        );

        $events->listen(
            'Illuminate\Auth\Events\Logout',
            'App\Listeners\UserEventSubscriber@handleUserLogout'
        );
    }
}

注册事件订阅器

# EventServiceProvider  
protected $subscribe = [
    'App\Listeners\UserEventSubscriber',
];

标签:Laravel,25,function,App,事件,监听器,event,listen
From: https://www.cnblogs.com/fuqian/p/17163949.html

相关文章

  • 24. Laravel 缓存
    Laravel缓存配套视频地址:https://www.bilibili.com/video/av77035719配置与准备配置文件:config/cache.php,.env可配置内容:1.使用哪个驱动2.驱动的配置......
  • 28. Laravel 内置聊天室
    Laravel内置聊天室配套视频地址:https://www.bilibili.com/video/av80196918配置打开config/app.php中BroadcastServiceProvider注释,即注册广播授权路由。在.e......
  • 27. Laravel 广播 – 私有频道
    Laravel内置聊天室配套视频地址:https://www.bilibili.com/video/av80196918配置打开config/app.php中BroadcastServiceProvider注释,即注册广播授权路由。在.e......
  • 30. Laravel 开发第三方包
    Laravel开发第三方包使用Contracts代替Facades,因为扩展包不能访问Laravel提供的所有测试Facades的辅助函数。自动发现和注册Facades"extra":{"laravel......
  • 29. Laravel 广播系统补充
    Laravel广播系统补充配套视频地址:https://www.bilibili.com/video/av80196918?p=2设置广播名称//默认是事件的类名publicfunctionbroadcastAs(){return's......
  • Laravel 最佳实践
    Laravel最佳实践翻译来源:https://github.com/alexeymezenin/laravel-best-practices单一职责原则不要这样做:publicfunctiongetFullNameAttribute(){if(aut......
  • Laravel 核心概念
    Laravel核心概念配套视频地址:https://www.bilibili.com/video/av76060293核心概念简介、服务容器、服务提供者、facade、contract、生命周期。简介我叫Laravel。......
  • 18. Laravel 模型关系:远程一对一
    Laravel模型关系:远程一对一配套视频地址:https://www.bilibili.com/video/av73028135?p=5一个帖子属于一个作者,该作者就读一所学校。帖子可通过作者访问作者所在的学校......
  • 17. Laravel 模型关系:多对多
    Laravel模型关系:多对多配套视频地址:https://www.bilibili.com/video/av73028135?p=4多对多:一个人可以扮演多个角色,一个角色可以被多个人扮演。数据结构#users:id,......
  • 19. Laravel 模型关系:远程一对多
    Laravel模型关系:远程一对多配套视频地址:https://www.bilibili.com/video/av73028135?p=5简单的说:Thread模型可以通过Author模型访问多个的Book模型。表threads......