[英]Why should i use events and listener in laravel
我了解laravel中的事件和侦听器,但是我不知道事件和正常函数之间有什么区别,这意味着如果我想发送邮件,为什么我应该使用事件,而我可以使用正常函数来换句话说,什么时候必须使用事件以及何时必须使用函数
事件是为存储在应用程序其他位置的可重用逻辑组织触发器的一种方式。
例如,假设您有一个注册用户的应用程序。 注册用户后,您可能希望采取某些措施,例如:
功能方法
您可以使用类似的功能在控制器中执行此操作(请参见示例中的优点和缺点)
RegisterController
<?php
namespace App\Http\Controllers\Auth;
class RegisterController extends Controller
{
...
protected function create(array $data)
{
// Create user
$user = User::create();
// Send Welcome Email
$this->sendWelcomeEmail($user);
// Update statistics database
$this->updateStatisticsDatabase($user);
// Add them to the mailing list
$this->addToMailingList($user);
}
protected function sendWelcomeEmail(User $user)
{
...
}
protected function updateStatisticsDatabase(User $user)
{
...
}
protected function addToMailingList(User $user)
{
...
}
...
}
优点
缺点
事件/侦听器方法
或者,我们可以将此功能拆分为Event
和Listener
。
RegisterController
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Events\UserWasRegistered;
class RegisterController extends Controller
{
...
protected function create(array $data)
{
// Create user
$user = User::create();
// Emit Event
event(new UserWasRegistered($user));
}
...
}
UserWasRegistered
<?php
namespace App\Events;
use App\User;
use Illuminate\Queue\SerializesModels;
class UserWasRegistered
{
use SerializesModels;
public $user;
/**
* Create a new event instance.
*
* @param \App\User $user
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
}
SendWelcomeEmail
<?php
namespace App\Listeners;
use App\Events\UserWasRegistered;
class SendWelcomeEmail
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param \App\Events\UserWasRegistered$event
* @return void
*/
public function handle(UserWasRegistered $event)
{
// Send the welcome email ...
}
}
优点
UserWasRegistered
事件,可以从应用程序中的任何位置调用该事件。 RegisterController
职责大大减少了 缺点
Event
,那么现在您的逻辑分布在多个文件中 TLDR
在简单的应用程序上,您只需要在单个控制器中进行功能编程。 在更大,更复杂的应用程序中, Event
和Listener
往往是更好的选择
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.