基於laravel的事件監聽實例

在分享這篇文章的時候,我假設你已經對laravel有必定的理解。並且已經知道什麼是觀察者模式。若是你還不能理解什麼是觀察者模式,那麼我建議你在讀這篇文章的時候先去看看觀察者模式的概念。這樣會更好地讓你理解代碼,和讀懂代碼。

在現實的開發中,咱們常常會碰到這樣的需求。產品經理說,要在用戶註冊的時候發送一條信息給用戶進行通知。那麼在傳統的作法裏面咱們可能會在註冊的方法裏面修改邏輯,直接在其本來的方法上面進行修改或者增長更多的邏輯。雖說這樣的寫法能夠實現功能。可是在代碼的簡潔度,以及違反了開閉原則。固然咱們在一些小項目中爲了追求速度,有時候怎麼方便怎麼寫也是無可厚非。不過若是有一天項目的體系大了那麼咱們終究仍是要在合適的地方用合適的模式去解決咱們實際業務的問題。

下面咱們就直接以來進行實戰吧。

首先找到\app\Providers\EventServiceProvider.php文件。在此文件中咱們加入咱們本身的事件監聽php

<?php

namespace App\Providers;

use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        // 用戶註冊後的事件
        'App\Events\Register' => 
            // 發送短信
            'App\Listeners\SendSms',
        ],
    ];
}複製代碼

接着咱們須要運行laravel

php artisan event:generate
複製代碼

上面這一句話運行後,laravel 會爲你在系統目錄中的 App\Event\目錄中生成一個Register的php文件。這個文件就是系統自動幫你生成的事件文件。另外也會生成一個SendSms文件在你的App\Listeners中。細心的你很快就會發現其生成的目錄以及文件就是你最初在laravel的事件服務提供的數組中註冊的內容。數據庫

接下來咱們看下咱們生成事件註冊文件數組

<?php

namespace App\Events;

use App\User;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;

class Register extends Event
{
    use SerializesModels;

    public $user;

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

在上面的事件中,咱們定義了一個$user去接受新註冊的用戶信息,而且經過實例化對象的時候把用戶信息存放起來。正如你所看到的,該事件類不包含任何特定邏輯,只是一個存放 User 對象的容器bash

接下來,讓咱們看看咱們的示例事件的監聽器,事件監聽器在 handle 方法中接收事件實例,event:generate 命令將會自動在 handle 方法中導入合適的事件類和類型提示事件。在 handle 方法內,你能夠執行任何須要的邏輯以響應事件:
app

<?php

namespace App\Listeners;

use App\Events\Register;

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

    /**
     * Handle the event.
     *
     * @param Register  $event
     * @return void
     */
    public function handle(Register $event)
    {
        // Access the order using $event->user...
          //獲取新註冊的用戶id
          $uid = $event->uid
           //調用發送信息接口
          Sms::send($uid,['register']);
    }
}複製代碼

最後咱們怎麼觸發事件呢?只須要在對應邏輯位置中經過event函數調用對應的事件方法便可ide

<?php
namespace App\Htt\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function register(Request $request)
    {
        //獲取參數
        //驗證參數
        //寫入數據庫
        //return 註冊信息
        //註冊完成後調用放信息(其中$user是註冊後返回的用戶信息)
        event(new Register($user));

    }
}複製代碼
相關文章
相關標籤/搜索