一.事件/广播
1.命令(事件在目录Events中, 监听器在Listeners中)
artisan make:event 或 artisan event:generate
前者创建一个事件,后者根据providers下EventServiceProvider中的$listen数组创建事件和监听器
2.基本简介
事件一般对应一个监听器;如果是广播事件,则无需监听器;
Event如果不是广播事件,则需要对应的Listeners;还需要在EventServiceProvider中进行事件监听器注册.
3.触发事件
event(new EventName($model));
Event::fire(new EventName($model));
3.使用场景
事件可以实现广播,如借助pusher实现消息推送
用户登录时,做一些处理
浏览文章时将文章浏览数+1等
4.事件也可以将其队列.但个人认为如果队列的话,其实可以使用jobs的.
二.任务/队列
1.默认情形下,任务是同步的;即立即执行.但任务一般都是耗时操作,所以需要将其放入队列.
2.命令,生成任务(目录jobs)
artisan make:job JobName
3.调用任务
控制器中:
$this->dispatch();
其他地方
use DispatchesJobs;
......
$this->dispatch()
5.使用场景
发送邮件等耗时操作或不需要实时执行的操作.
三.中间件
1.中间件是为了确保路由或一个控制器中所有方法被允许访问.
2.在Kenel中注册
四.策略
1.策略是为了确保控制器中的某个方法或模板中的某个显示被允许访问.策略是基于model的
2.生成命令
artisan make:policy PostPolicy --model=Post
3.在AuthServiceProvider中进行注册
protected $policies = [MovieModel::class => MoviePolicy::class];
3.使用
a.user模型的can和cant
b.blade中can或cannot
c.控制器
$this->authorize
d.Gates的allows和denies
五.Model观察者或事件
1.Eloquent模型会触发很多事件,可以在AppServiceProvider中进行监听
creating
created
updating
updated
saving
saved
deleting
deleted
restoring
restored
示例代码
class AppServiceProvider extends ServiceProvider { /** * 启动所有应用程序服务。 * * @return void */ public function boot() { User::creating(function ($user) { if (! $user->isValid()) { return false; } }); } /** * 注册服务提供者。 * * @return void */ public function register() { // } }
2.也可以对某个模型注册一个事件观察者
(1).在app下新建Observers目录,创建一个基于MessageModel的消息观察者
class MessageObserver { /** * @param MessageModel $msg */ public function saved(MessageModel $msg) { // 更新缓存中消息数目 $userId = $msg->uid; $userGuid = new UserCacheService($userId); $userGuid->refreshMsg(); } }
(2).在EventServiceProvider的boot方法中进行注册
public function boot(DispatcherContract $events) { parent::boot($events); MessageModel::observe(new MessageObserver()); }