在许多状况下,当咱们的应用程序变得更大,而且须要处理愈来愈多的任务时,咱们的控制器,演示者或服务的大小能够快速增长,而且很容易变得难以处理,没法测试和缓慢。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事件文档。
原文地址: https://phpcasts.org/posts/keep-the-code-clean-with-laravel-events