## 事件系統
事件提供了一個簡單的觀察者實現,能夠訂閱和監聽應用中發生的各種事件。事件類通常存放在`app/Events`目錄下,而這些事件類的監聽器則存放在`app/Listeners`目錄下。
事件系統為應用各個方面的解耦提供了非常棒的方法,因為單個事件可以擁有多個互不依賴的監聽器。舉個例子,你可能希望每次訂單發貨時向用戶推送一個 Slack 通知。你可以簡單地發起一個可以被監聽器接收并轉化為 Slack 通知的`OrderShipped`事件,而不是將訂單處理代碼和 Slack 通知代碼耦合在一起。
事件定義:
```php
namespace App\Events;
/**
* 訂單支付成功
*
* Class OrderPaySuccessEvent
* @package App\Events
*/
class OrderPaySuccessEvent extends Event
{
protected $name = 'order.pay.success.action';
public $order;
public function __construct($order = [])
{
$this->order = $order;
}
}
```
監聽器定義:
```php
namespace App\Listeners;
use App\Events\OrderPaySuccessEvent;
/**
* 支付異步通知
* Class PayAsyncNotifyListener
*
* @package App\Listeners
*/
class PayAsyncNotifyListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
}
/**
* 執行事件
*
* @param OrderPaySuccessEvent $event
*
* @throws \Fend_Exception
*/
public function handle( OrderPaySuccessEvent $event )
{
$order = $event->order;
// 業務邏輯代碼...
}
}
```
邏輯處理寫在 `handle` 方法即可。
事件與監聽器的配置在`app\Providers\EventServiceProvider.php` 文件。
具體示例:
```php
namespace App\Providers;
use App\Events\Event;
use App\Fend\ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* 應用程序的事件監聽器映射
*
* @var array
*/
protected $listen = [
// 商品下單完成事件
// OrderCreateCompleteEvent::class => [
// AppOrderCreateCompleteListener::class,
// WechatOrderCreateCompleteListener::class,
// ],
// 示例事件
'example.action' => [
\App\Listeners\ExampleListener::class,
\App\Listeners\WangleleListener::class,
],
// 訂單創建成功
'order.create.complete.action' => [
],
// 訂單支付成功通知
'order.pay.success.action' => [
\App\Listeners\PowerAddListener::class,
\App\Listeners\GiftReceiveListener::class,
\App\Listeners\PayAsyncNotifyListener::class, // 異步通知監聽器放在最后
],
// 訂單退款成功通知
'order.refund.success.action' => [
\App\Listeners\PowerRemoveListener::class,
],
// 兌換卡激活成功通知
'rechargecard.actived.action' => [
\App\Listeners\RechargeCard\RechargeListener::class,
\App\Listeners\RechargeCard\SendGiftListener::class,
],
// 學習卡激活成功通知
'studycard.actived.action' => [
\App\Listeners\StudyCard\RechargeListener::class,
\App\Listeners\StudyCard\SendGiftListener::class,
\App\Listeners\StudyCard\ActivityListener::class,
],
];
/**
* The subscriber classes to register.
*
* @var array
*/
protected $subscribe = [];
/**
* Register the application's event listeners.
*
* @return void
*/
public function boot()
{
$events = $this->app['events'];
foreach ($this->listen as $event => $listeners) {
foreach ($listeners as $listener) {
$events->addListener($event, [new $listener, 'handle']);
}
}
foreach ($this->subscribe as $subscriber) {
$events->addSubscriber($subscriber);
}
}
/**
* {@inheritdoc}
*/
public function register()
{
//
}
/**
* Get the events and handlers.
*
* @return array
*/
public function listens()
{
return $this->listen;
}
}
```