我们先来了解下事件和监听,事件就是我们要做某一个动作,例如,发送邮件,发送短信,站内信等等,但我们想把这些剥离出来,放在一个类里面,然后把各项的动作放在另一个单独的文件里面。这些单独的文件可以称做监听。
我们在此举一个例子。当新客户注册的时候,我们需要发给他一个欢迎邮件,然后把他纳入到我们的邮件订阅列表里,然后在给管理员发送一个新用户注册成功的消息。
我们把这三个动作放到一个事件里面。我们可以直接写在控制器里面,当然也可以做成一个事件类。为了节省事件,我们直接用一行代码代替一个监听事件。
dump("sent an email to the customer");
dump("let the customer subscribe");
dump("send notification to the admin");
我们把这三个动作做成一个事件,执行命令:
php artisan make:event NewUserRegisteredEvent
这样就会在app/Events/文件夹下面产生一个NewUserRegisteredEvent.php的文件。里面有一个构造函数和broadcastOn的方法。如果我们要传参,可以在构造函数里面传参,例如:
public $user;
public function __construct($user){
$this->user = $user;
}
把属性设置为public是因为要引入到监听事件里面。这时候我们可以在控制器里把这个类引进去来代替之前的三个动作:
event(new NewUserRegisteredEvent($user));
接下来我们做个监听事件:
php artisan make:listener WelcomeNewCustomer
我们会发先多了一个app\listeners文件夹,多了一个文件就是WelcomeNewCustomer.php,我们打开文件,发现里面有个构造方法和handle方法。我们在handle方法里面写我们具体的业务逻辑:
dump("sent an email to the customer");
把这一行代码放进去,为了方便,我没有写具体的发邮件的代码,请看官自行编纂。然后同理,我们可以创建其他的监听事件放进去,不过我们先不做,我会给你们另外一个做法。这里还有一个补充点就是handle函数有一个user这个变量。$event->user,这样写便可。
这时候我们打开app\providers\eventserviceprovider.php便可以进行对event和listeners的对照。
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
这里连接event和listener的节点,我们来把我们刚才做的event和listener在这里做一个连接。
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
NewUserRegisteredEvent::class => [
\App\Listeners\SendWelcomeEmail::class,
\App\Listeners\AddToSubscriber::class,
\App\Listeners\SendAdminNotice::class
]
];
你发现我们还没有产生的listener类现在都已经放在里面了,我们如何产生呢?很简单就用一个
php artisan event:generate
这样我们会发现在EventServiceProvider.php里面定义的都会在app\listeners文件夹下出现了。虽后我们把剩下的两个动作放在相应的listener文件里。
网友评论