事件系统
事件功能实际上更倾向是一种管理手段,并不是没了它我们就做不到了,只是它能让我们做得更加好,更加优雅;它首先有一个总的目录,然后我们可以宏观的看到所有的事件,而不需要每次都要打开控制器的方法我们才能知道注册后会发生什么。
1.事件是一种常见的观察者模式应用。简单的来说,就是当... 干... (event ... listeners...)
2.先注册再生成
Provider/EventServiceProvider.php
建议使用自动注册
php artisan event:generate
3.放置 event 和 listener 文件的位置分别是:
app/Events
app/Listeners
4.使用事件系统的好处:对于程序员来说,事件可以让 Controller 变得非常简洁,解耦,可更简洁的维护。
举个🌰:
创建订单,订单信息记录到数据库;发送邮件或者短信给用户订单生成到结果
public function addOrder(Request $request){
//生成订单
$order = $this->createOrder();
//发送短信
$this->sendEmail();
...
}
protected function createOrder(){
// 生成订单逻辑
}
protected function sendEmail(){
//发送邮件逻辑
}
protected function sendSms(){
//发送短信逻辑
}
一般性的做法 同步执行 必须一个执行完成后再执行另外一个,而且代码的复用太低 如果有其他业务需求也需要发送 邮件和短信 就必须重新写一套。
事件系统操作:
1.controller
public function addOrder(Request $request){
//生成订单
$order = $this->createOrder();
//订单事件
event(new OrderEvent($order));
}
2.event
class OrderEvent
{
//use Dispatchable, InteractsWithSockets, SerializesModels;
public $order;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($order)
{
//
$this->order = $order;
}
}
- listeners 各种监听类
class SendSms {
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(OrderEvent $event)
{
//
$order = $event->order;
//执行发送短信的业务逻辑了
}
}
//如果implements ShouldQueue这个接口的话就会异步队列执行,如果去掉的话就是同步执行。(前提是配置队列启动一个队列监听)
class SendEmail implements ShouldQueue{
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(OrderEvent $event)
{
//
$order = $event->order;
//执行发送邮件的业务逻辑了
}
}
网友评论