Laravel事件Event初尝试
1,需要注册事件或侦听器
<?php
namespace App\Providers;
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* 注册事件和侦听器.
*
* @var array
*/
protected $listen = [
'App\Events\SomeEvent' => [ // 事件类
'App\Listeners\EventListener', // 侦听类1
'App\Listeners\EventListenerOther', // 侦听类2...
],
];
/**
* Register any other events for your application.
*
* @param \Illuminate\Contracts\Events\Dispatcher $events
* @return void
*/
public function boot(DispatcherContract $events)
{
parent::boot($events);
//
}
}
注册完事件或侦听器后,可使用 php artisan event:generate 创建事件或侦听器类。
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class SomeEvent extends Event
{
use SerializesModels;
public $data;
/**
* 创建一个事件实例.
* 接收数据,供侦听类使用
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
3,创建侦听类
<?php
namespace App\Listeners;
use App\Events\SomeEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
/**
* 事件侦听类1
* 这是一个可队列的异步事件侦听器
*
* @package App\Listeners
*/
class EventListener implements ShouldQueue
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param SomeEvent $event
* @return void
*/
public function handle(SomeEvent $event)
{
var_dump($event->data);
echo '这里是第一个事件<hr>';
}
}
还有
<?php
namespace App\Listeners;
use App\Events\SomeEvent;
/**
* 事件侦听类2
*
* @package App\Listeners
*/
class EventListenerOther
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param SomeEvent $event
* @return void
*/
public function handle(SomeEvent $event)
{
var_dump($event->data);
echo '这里是第二个事件<hr>';
return false; // 从这里停止事件传播
}
}
4,触发事件
<?php
namespace App\Http\Controllers;
use App\Events\SomeEvent;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Event;
class HomeController extends Controller
{
/**
* 首页
*
* @param Request $request
* @return array
*/
public function getIndex(Request $request)
{
// 获取数据
$data = $request->all();
// 触发事件
Event::fire(new SomeEvent($data));
}
}
至此,一套完整的事件流程就成功了!