从字面上就可以看出来,无非就是监听一个事件。
2.使用场景
例句一个物流发货的场景:我有个小程序商城,用户下单后需要在后台发货,发完货后我想在微信发送个模块通知提示用户,我想了想用户不登录微信或者把消息提示关闭了,那岂不是不能实时通知用户已经发货了,我决定再加个短信通知用户。有了模块通知,短信通知后我还嫌不够...然后我继续加....
通常我们会这么写:
namespace
App
\
Http
\
Controllers
;
use
Illuminate
\
Http
\
Request
;
class
OrderController
extends
Controller
public
function
sendGoods
(
)
复制代码
**这样写不是不可以,但是逻辑功能越来越多,控制器只会变得臃肿起来,后期不便于维护。这时候可能会有人说,那我可以封装起来啊,是的,你可以封装起来,然后就可以用简短的代码来实现。但是实际项目中,会涉及多人开发,这样就不方便了。所以推荐使用laravel自带的“事件监听“... **
3.使用”事件监听"优化代码
3.1 打开终端->切换到项目根目录->使用artisan命令创建事件监听文件
php artisan make:event OrderEvent
复制代码
执行完命令,发现 app/Events 目录下多了个 OrderEvent.php 文件
我们可以打开看看...
namespace
App
\
Events
;
use
Illuminate
\
Broadcasting
\
Channel
;
use
Illuminate
\
Queue
\
SerializesModels
;
use
Illuminate
\
Broadcasting
\
PrivateChannel
;
use
Illuminate
\
Broadcasting
\
PresenceChannel
;
use
Illuminate
\
Foundation
\
Events
\
Dispatchable
;
use
Illuminate
\
Broadcasting
\
InteractsWithSockets
;
use
Illuminate
\
Contracts
\
Broadcasting
\
ShouldBroadcast
;
class
OrderEvent
use
Dispatchable
,
InteractsWithSockets
,
SerializesModels
;
* Create a new event instance.
*
@return
void
public
function
__construct
(
)
* Get the channels the event should broadcast on.
*
@return
\Illuminate\Broadcasting\Channel|array
public
function
broadcastOn
(
)
return
new
PrivateChannel
(
'channel-name'
);
复制代码
简单的修改下构造函数,因为到时候我们可能会 传入 购买商品的 用户
namespace
App
\
Events
;
use
App
\
User
;
use
Illuminate
\
Broadcasting
\
Channel
;
use
Illuminate
\
Queue
\
SerializesModels
;
use
Illuminate
\
Broadcasting
\
PrivateChannel
;
use
Illuminate
\
Broadcasting
\
PresenceChannel
;
use
Illuminate
\
Foundation
\
Events
\
Dispatchable
;
use
Illuminate
\
Broadcasting
\
InteractsWithSockets
;
use
Illuminate
\
Contracts
\
Broadcasting
\
ShouldBroadcast
;
class
OrderEvent
use
Dispatchable
,
InteractsWithSockets
,
SerializesModels
;
public
$user
;
* Create a new event instance.
*
@return
void
public
function
__construct
(
User
$user
)
$this
->user =
$user
;
* Get the channels the event should broadcast on.
*
@return
\Illuminate\Broadcasting\Channel|array
public
function
broadcastOn
(
)
return
new
PrivateChannel
(
'channel-name'
);
复制代码
3.2 绑定事件
打开 app/Providers/EventServiceProvider.php 文件,找到 成员属性 listen下:
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
复制代码
把事件关联起来,修改为:
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
'App\Events\OrderEvent' => [
'App\Listeners\sendModel',
'App\Listeners\sendPhone',
复制代码
接着打开终端,执行 artisan 命令 生成 监听文件
php artisan event:generate
复制代码
然后我们可以在 app/Listeners 文件下发现多了两个文件
打开这两个文件,依次修改为:
sendModel.php:
namespace
App
\
Listeners
;
use
App
\
Events
\
OrderEvent
;
use
Illuminate
\
Queue
\
InteractsWithQueue
;
use
Illuminate
\
Contracts
\
Queue
\
ShouldQueue
;
class
sendModel
* Create the event listener.
*
@return
void
public
function
__construct
(
)
* Handle the event.
*
@param
OrderEvent $event
*
@return
void
public
function
handle
(
OrderEvent
$event
)
$user
=
$event
->user;
dump
(
'发送消息模板成功'
);
复制代码
sendPhone.php:
namespace
App
\
Listeners
;
use
App
\
Events
\
OrderEvent
;
use
Illuminate
\
Queue
\
InteractsWithQueue
;
use
Illuminate
\
Contracts
\
Queue
\
ShouldQueue
;
class
sendPhone
* Create the event listener.
*
@return
void
public
function
__construct
(
)
* Handle the event.
*
@param
OrderEvent $event
*
@return
void
public
function
handle
(
OrderEvent
$event
)
$user
=
$event
->user;
dump
(
'发送短信消息成功'
);
复制代码
3.3 最后我们再打开 OrderController.php 修改为:
namespace
App
\
Http
\
Controllers
;
use
App
\
Events
\
OrderEvent
;
use
App
\
User
;
use
Illuminate
\
Http
\
Request
;
class
OrderController
extends
Controller
public
function
sendGoods
(
)
$user
=
User
::
find
(
1
);
dump
(
'发货成功!!'
);
event
(
new
OrderEvent
(
$user
));
复制代码
3.4 绑定路由
Route::get('/sendGoods','OrderController@sendGoods');
复制代码
3.5 访问路由结果:
4. 总结
这样是不是简单,便于维护了许多呢... 还不会的小伙伴赶紧去试试吧!如果对你有帮助,请给个赞,谢谢!