当前位置: 首页 > 后端技术 > PHP

LaravelEvent-ListenerExample

时间:2023-03-30 02:25:14 PHP

介绍上一篇文章实现了记录用户访问,但是设计有缺陷,中间件代码紧耦合。如果以后需要修改需求,不仅要记录ip和city,还要记录数据到一个新的数据表,或者做其他的统计,不停地增加和修改代码是不合理的。这时候可以使用Laravel的事件/监听器进行处理。代码在GitHub上可用。事件/监听器Laravel事件提供了观察者模式的简单实现,允许您订阅和监听应用程序中的事件。观察者模式有时也称为发布/订阅模式,用于实现对对象的发布/订阅功能:一旦主体对象的状态发生变化,与其关联的观察者对象就会收到通知,并执行相应的操作。以上是对事件/监听器和观察者模式的简单描述。结合这个需求理解,当一个用户访问事件被触发时,它的观察者就会进行处理。观察者可以有多个,本例只进行存储操作。创建事件/监听器将事件/监听器添加到app/Providers/EventServiceProvider.php文件中,如下/***应用程序的事件监听器映射。**@vararray*/protected$listen=[Registered::class=>[SendEmailVerificationNotification::class,],'App\Events\UserBrowse'=>['App\Listeners\CreateBrowseLog',//其他监听器],];添加后,执行phpartisanevent:generate,会自动创建对应的事件/监听器。分别创建了app/Events/UserBrowse.php和app/Listeners/CreateBrowseLog.php。实现代码集中在事件app/Events/UserBrowse.php文件,这里需要接收数据进行后续处理,代码如下public$ip_addr;公共$request_url;公共$城市名称;/***创建一个新的事件实例。**@returnvoid*/publicfunction__construct($ip_addr,$request_url,$city_name){$this->ip_addr=$ip_addr;$this->request_url=$request_url;$this->city_name=$city_name;}然后监听App/Listeners/CreateBrowseLog.php,这里要做的就是把事件中接收到的数据存储起来,代码如下/***处理事件。**@paramUserBrowse$event*@returnvoid*/publicfunctionhandle(UserBrowse$event){$log=new\App\Models\BrowseLog();$log->ip_addr=$event->ip_addr;$log->request_url=$event->request_url;$log->city_name=$event->city_name;$日志->保存();}分发事件最后就是分发事件,修改app/Http/Middleware/BrowseLog.php中间件的代码,修改如下/***Handleanincomingrequest。**@param\Illuminate\Http\Request$request*@param\Closure$next*@returnmixed*/publicfunctionhandle($request,Closure$next){//使用事件/监听器存储event(newUserBrowse($request->getClientIp(),$request->path(),get_city_by_ip(false,'null')));返回$next($request);}经过测试,没有问题就是将存储操作从中间件转移到监听器,其实意义远不止于此。例如,同一个事件可以分布在不同的地方;如果事件增加了需求,只需要增加监听器即可;queues也可以用在listener等。参考:Events,ObserverPattern。