为了解决,添加数据成功后,代码不在控制器中编写,让代码分层
使用artisan命令来添加模型观察事件
//此命令是laravel5.5之后才有的,之前想要有此功能,手动创建目录和文件
php artisan make:observer NoticeObserver -m Notice
安装之后位置 app\Observers\NoticeObserver.php
需要在模型中注册一下
/**
* 使用laravel提供模型初始化方法 方法中最早执行
*/
protected static function boot(){
parent::boot(); // TODO: Change the autogenerated stub
//注册自定义观察类
self::observe(NoticeObserver::class);
}
在事件观察类中添加如下的事件,名写上日志
/**
* 调用注册模型create添加时执行
* Handle the Notice "created" event.
*
* @param \App\Models\Notice $notice
* @return void
*/
public function created(Notice $notice)
{
sleep(5);
Log::info('======添加成功====');
}
此时表单提交数据后,就会在触发模型事件,就会写入日志
消息队列
根据上图,首先创建消息管道,来存储任务
本次使用mysql表来当消息管道
创建容器数据表
php artisan queue:table 任务队列表 php artisan queue:failed-table 执行任务失败后,存储的表 php artisan migrate 执行迁移
在.env文件中设置框架异步
在config目录中查看laravel默认支持的消息队列驱config\queue.php
'default' => env('QUEUE_CONNECTION', 'sync'),
//改成
'default' => env('QUEUE_CONNECTION', 'database'),
//不修改的话,可以在 .env 里修改
QUEUE_CONNECTION=database
创建任务
php artisan make:job xxx
安装之后位置 app\Jobs\NoticeJob.php
在模型事件中添加一个任务,生产一个任务
namespace App\Observers;
class NoticeObserver
{
/**
* 调用注册模型create添加时执行
* Handle the Notice "created" event.
*
* @param \App\Models\Notice $notice
* @return void
*/
public function created(Notice $notice)
{
//添加生产任务
dispatch(new NoticeJob());
}
在任务文件中添加要干的事情
namespace App\Jobs;
/**
* 添加要干的事
* Execute the job.
*
* @return void
*/
public function handle()
{
sleep(5);
Log::info('======添加成功====');
}
此时如果添加预约,添加成功后,就会在消息容器中有一个任务待执行
消费者
因为使用了laravel自带消息队列,所以消费者不需要写任务代码
//使用php artisan来消费它
php artisan queue:work
总结
了解ORM模型事件定义
为何要使用?
可以让代码业务分离,方便日后代码升级维护。
如何使用
创建一个观察类
php artisan make:observer Xxxobserver -m 模型
常用事件方法
creating/created
updating/updated
给指定的模型绑定监听
public static function boot(){
parent::boot();
self:observe(观察类::class);
}
模型事件就绑定成功
能够添加任务到队列中
为何用队列呢?
为了提高并发,减少服务器压力,做到任务的异步
生产者 ---> 管道 ---> 消费者
使用laravel提供消息队列
管道:数据库
迁移文件
修改.env配置文件,让队列变为异步
创建一个任务 php artisan make:job XxxJob
在任务类中 handle 写任务代码,要干的活
在需要另人去干活的地方去生成一下 dispatch(new XxxJob());
另起一个进程,来进行消费
php artisan queue:work