1,在 Providers 目录下的 EventServiceProviders.php 文件 中,手动加入红色框起来的代码。
'App\Events\Demo' => [
'App\Listeners\DemoListener',
],
2,在项目的根目录执行
php artisan event:generate
此时项目中,会多出两个目录 ,Events 和 Listeners 。并会自行创建两个文件 , Demo.php 和 DemoListener.php 如下图所示
3,Demo.php 文件中的内容:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class Demo
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
4,DemoListeners.php 文件中的内容:
<?php
namespace App\Listeners;
use App\Events\Demo;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class DemoListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param \App\Events\Demo $event
* @return void
*/
public function handle(Demo $event)
{
$data = $event->data;
file_put_contents("../logs.txt",json_encode($data).PHP_EOL,FILE_APPEND);
}
}
5,在控制器中,自己写一下测试事件的数据如下
public function index()
{
$arr = [1,2,3,'laravel event'];
event(new Demo($arr));
echo "事件执行完毕";
}
6,访问控制器,看事件是否执行成功,结果会在项目根目录下,出现一个logs.txt文件,如下图:
以上就是laravel事件的简单实用,仅供参考
接下来是学习event+queue的使用。
1,将 DemoListener 继承(implements) ShouldQueue ,在上面的基础上,只是增加了,圈红的代码。如图所示:
<?php
namespace App\Listeners;
use App\Events\Demo;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
use Illuminate\Queue\InteractsWithQueue;
class DemoListener implements ShouldQueue
{
public $queue = 'demo';
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param \App\Events\Demo $event
* @return void
*/
public function handle(Demo $event)
{
$data = $event->data;
Log::info(json_encode($data).PHP_EOL);
//file_put_contents("../logs.txt",json_encode($data).PHP_EOL,FILE_APPEND);
}
}
2,修改一下 config 目录下的 queue.php 文件,主要位置,如图所示:可以根据自己的需求,自行更改。
3,访问一下控制器。这次很惊讶的发现,项目根目录没有找到 logs.txt 文件。这是因为,这次是事件 + 队列的形式。访问控制器,只是把事件放入redis队列中,但是还没有执行。下图就是:redis中事件的内容
注意:
1,项目需要在laravel生成的.env文件中将队列驱动由同步sync改为redis
QUEUE_CONNECTION=redis
2,使用redis异步驱动,需要安装predis/predis包
composer require predis/predis
3,用框架自带的log文件代替了上面的logs.txt 文件
4,队列中已经有事件了,下面就执行一下该队列。如图所示:
php artisan queue:listen --queue=demo
最后log文件会记录信息
总结:
事件 + 队列 和 事件的单独使用,区别在于,被监听的事件类,是否 继承 ShouldQueue。如果没有继承则就是单独的事件,继承则就是事件+队列。
单独的事件:就是当程序触发事件以后,事件会立即执行。
事件+队列:就是当程序触发事件以后,事件首先会被分发到队列。等待队列依次的执行。