在許多狀況下,當咱們的應用程序變得更大,而且須要處理愈來愈多的任務時,咱們的控制器,演示者或服務的大小能夠快速增長,而且很容易變得難以處理,沒法測試和緩慢。php
從新組織咱們的邏輯,並將不一樣類型的任務放到專門的類中,可能會很是有用,而且這是推薦的「最佳」實踐。laravel
爲何?處理更多但更小的碎片比處理巨大巨石中的全部物件要容易得多。最重要的是,你的應用程序變得更加可測試,你不會破壞SRP,而且最終你能夠輕鬆得到更乾淨更漂亮的代碼。app
其中一項有用的技巧是Laravel的 Event 服務。 首先,在各類狀況下,經過將任務移至事件類,可完全清理控制器。 使用事件的另外一個緣由是隊列系統,它容許你的應用程序異步完成做業,這能夠極大地加速你的應用程序。異步
事件系統有兩個重要部分。 事件自己和偵聽器(Listener)能夠綁定到特定的事件。 事件類負責序列化傳入數據,並將其傳遞給偵聽器,旨在在事件觸發後處理邏輯的內容。ide
觸發事件從未如此簡單,咱們所要作的就是調用 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