使用Laravel事件保持代碼清潔

在許多狀況下,當咱們的應用程序變得更大,而且須要處理愈來愈多的任務時,咱們的控制器,演示者或服務的大小能夠快速增長,而且很容易變得難以處理,沒法測試和緩慢。php

單一職責

從新組織咱們的邏輯,並將不一樣類型的任務放到專門的類中,可能會很是有用,而且這是推薦的「最佳」實踐。laravel

爲何?處理更多但更小的碎片比處理巨大巨石中的全部物件要容易得多。最重要的是,你的應用程序變得更加可測試,你不會破壞SRP,而且最終你能夠輕鬆得到更乾淨更漂亮的代碼。app

開始使用事件

其中一項有用的技巧是Laravel的 Event 服務。 首先,在各類狀況下,經過將任務移至事件類,可完全清理控制器。 使用事件的另外一個緣由是隊列系統,它容許你的應用程序異步完成做業,這能夠極大地加速你的應用程序。異步

事件系統有兩個重要部分。 事件自己和偵聽器(Listener)能夠綁定到特定的事件。 事件類負責序列化傳入數據,並將其傳遞給偵聽器,旨在在事件觸發後處理邏輯的內容。ide

實際中使用事件 (Event)

觸發事件從未如此簡單,咱們所要作的就是調用 event() helper,並將事件的類做爲參數。如: event(UserRegistered::class)post

經過一個常見的例子,讓咱們看看它在現實生活中的做用。在咱們的應用程序中,咱們但願向咱們的新用戶發送歡迎電子郵件。測試

首先,咱們須要在 EventServiceProvider 中綁定事件和偵聽器。若是咱們想要處理特定事件的不一樣邏輯,咱們能夠將更多監聽器附加到事件上。this

// app/Providers/EventServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        'App\Events\UserRegistered' => [
            'App\Listeners\SendWelcomeEmail',
        ],
    ];
}

當綁定準備就緒時,咱們能夠使用 php artisan event:generate 生成一對 事件-偵聽器,或者咱們能夠使用 artisan make 命令單首創建它們。spa

咱們的事件沒有其餘責任,只是將用戶指定爲公共財產,可能會傳遞給偵聽器。code

// app/Events/UserRegistered.php

<?php

namespace App\Events;

use App\User;

class UserRegistered
{
    public $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

咱們的偵聽器Listener是重要的一部分。 它實現了 ShouldQueue 接口,這意味着這個事件將被推送到隊列堆棧。 在 handle 方法中,咱們正在實現將電子郵件發送給給定用戶的邏輯。

// app/Listeners/SendWelcomeEmail.php

<?php

namespace App\Listeners;

use App\Mail\WelcomeEmail;
use App\Events\User\Created;
use Illuminate\Support\Facades\Mail;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue
{
    use InteractsWithQueue;

    public function handle(Created $event)
    {
         Mail::to($event->user)->send(new WelcomeEmail($event->user));
    }
}

重組咱們的邏輯可能很是有用,尤爲是當你須要處理大量任務時。事件和偵聽器可能對你有很大的幫助。你能夠在這裏找到官方的Laravel事件文檔

更多PHP知識,請前往 PHPCasts