Laravel 事件&异步处理

生成事件

php aritsan make:event Test

事件和监听 listen 是一对多的管理,一个事件对应多个响应事件

定一个$data 属性,赋值触发事件时传递的数据。

   public $data;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        $this->data = $data;


    }

如何在业务中触发?

   public function test(){
       Test::dispatch('你好事件');
   }

添加监听者

php artisan make:listener TestLisenter

namespace App\Lisenter;
use App\Events\Test;
class TestLisenter 
{
    public function handle(Test $test)
    {
        var_dump($test->data);
        //打印:你好事件
    }
}

如何接受 “你好事件?”

这个时候我们要创建, listen 对象来处理业务逻辑

laravel 有提供两种方案:

方案一:

EventServiceProvider 添加$listen 数组信息比如:

/**
 * 应用程序的事件监听器映射
 *
 * @var array
 */
protected $listen = [
    'App\Events\Test' => [
        'App\Listeners\TestListenter',
    ],
];
方案二:

让系统自动处理,遍历指定目录
需要在EventServiceProvider 添加:

/**
 * 确定是否应自动发现事件和侦听器
 *
 * @return bool
 */
public function shouldDiscoverEvents()
{
    return true;
}
/**
 * 获取应该用于发现事件的监听器的目录
 *
 * @return array
 */
  protected function discoverEventsWithin()
    {
        return [
            $this->app->path('Lisenter'),//事件关联的监听器目录APP/Lisenters
            $this->app->path('Lisenter/test'),//事件关联的监听器目录APP/Lisenters/test
        ];
    }

系统会自动的匹配Listen

此时, 已经完成了事件的流程。如果没有成功或者想知道更多事件的处理,比如,延时队列,判断是否要加入事件,处理失败之后的处理等等:参考文档

事件的队列处理

如果没有接触laravel 的队列的小伙伴,先参考: Laravel Jobs

只需要在 TestLisenter 实现 ShouldQueue 的接口即可

长这样:

namespace App\Lisenter;
use App\Events\Test;
use Illuminate\Contracts\Queue\ShouldQueue;

class TestLisenter implements ShouldQueue
{
    public function handle(Test $test)
    {
        var_dump($test->data);
        //打印:你好事件
    }
}

和我做朋友?

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
xiaoAgiao

“监听者” 需要手动启动一个常驻进程嘛?

3年前 评论
justmd5 3年前
liaosp (楼主) 3年前
xiaoAgiao (作者) 3年前

事件监听属于同步观察还是异步观察

2年前 评论
liaosp (楼主) 2年前
o扬帆远航x 7个月前
liaosp (楼主) 7个月前
o扬帆远航x 7个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
37
粉丝
16
喜欢
132
收藏
113
排名:327
访问:2.9 万
私信
所有博文
社区赞助商