Laravel 中的事件監聽

1.什麼是「事件監聽「?

從字面上就能夠看出來,無非就是監聽一個事件。php

2.使用場景

例句一個物流發貨的場景:我有個小程序商城,用戶下單後須要在後臺發貨,發完貨後我想在微信發送個模塊通知提示用戶,我想了想用戶不登陸微信或者把消息提示關閉了,那豈不是不能實時通知用戶已經發貨了,我決定再加個短信通知用戶。有了模塊通知,短信通知後我還嫌不夠...而後我繼續加.... 一般咱們會這麼寫:html

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class OrderController extends Controller
{
    public function sendGoods()
    {
        //@todo:發貨邏輯
        //@todo:模塊通知邏輯
        //@todo:短信通知邏輯
        //@todo:等等....
    }
}

複製代碼

**這樣寫不是不能夠,可是邏輯功能愈來愈多,控制器只會變得臃腫起來,後期不便於維護。這時候可能會有人說,那我能夠封裝起來啊,是的,你能夠封裝起來,而後就能夠用簡短的代碼來實現。可是實際項目中,會涉及多人開發,這樣就不方便了。因此推薦使用laravel自帶的「事件監聽「... **laravel

3.使用」事件監聽"優化代碼

3.1 打開終端->切換到項目根目錄->使用artisan命令建立事件監聽文件git

php artisan make:event OrderEvent
複製代碼

執行完命令,發現 app/Events 目錄下多了個 OrderEvent.php 文件github

記錄下學習筆記(Laravel 中的事件監聽)

咱們能夠打開看看...小程序

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class OrderEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

複製代碼

簡單的修改下構造函數,由於到時候咱們可能會 傳入 購買商品的 用戶bash

<?php

namespace App\Events;

use App\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class OrderEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

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

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

複製代碼

3.2 綁定事件微信

打開 app/Providers/EventServiceProvider.php 文件,找到 成員屬性 listen下:app

protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];
複製代碼

把事件關聯起來,修改成:ide

protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        'App\Events\OrderEvent' => [
            'App\Listeners\sendModel',
            'App\Listeners\sendPhone',
        ]
    ];
複製代碼

接着打開終端,執行 artisan 命令 生成 監聽文件

php artisan event:generate
複製代碼

而後咱們能夠在 app/Listeners 文件下發現多了兩個文件

記錄下學習筆記(Laravel 中的事件監聽)

打開這兩個文件,依次修改成:

sendModel.php:

<?php

namespace App\Listeners;

use App\Events\OrderEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class sendModel
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  OrderEvent  $event
     * @return void
     */
    public function handle(OrderEvent $event)
    {
        $user = $event->user; // @todo: 當前用戶
        //@todo:發送消息模板邏輯
        dump('發送消息模板成功');
    }
}

複製代碼

sendPhone.php:

<?php

namespace App\Listeners;

use App\Events\OrderEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class sendPhone
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  OrderEvent  $event
     * @return void
     */
    public function handle(OrderEvent $event)
    {
        $user = $event->user; // @todo: 當前用戶
        //@todo:發送短信消息
        dump('發送短信消息成功');
    }
}

複製代碼

3.3 最後咱們再打開 OrderController.php 修改成:

<?php
namespace App\Http\Controllers;
use App\Events\OrderEvent;
use App\User;
use Illuminate\Http\Request;
class OrderController extends Controller
{
    public function sendGoods()
    {
        $user = User::find(1);
        //@todo:發貨邏輯
        dump('發貨成功!!');
        event(new OrderEvent($user));
    }
}

複製代碼

3.4 綁定路由

Route::get('/sendGoods','OrderController@sendGoods');
複製代碼

3.5 訪問路由結果:

記錄下學習筆記(Laravel 中的事件監聽)

4. 總結

這樣是否是簡單,便於維護了許多呢... 還不會的小夥伴趕忙去試試吧!若是對你有幫助,請給個贊,謝謝!

我的博客

原文

相關文章
相關標籤/搜索