文章目录 [+]
我们好多初学Laravel的人在接触到事件系统的时候并不知道这个事件系统会在什么场景下应用,那么我这里先说一下什么场景下会应用到事件系统。
事情大概是这样的,需求要在用户注册的时候发一些帮助邮件给用户(原本用户在注册之后已经有发别的邮件的了,短信,IM什么的)
原来这个注册的方法也就10多行代码。但是有时候我们为了省事,直接在注册代码后面添加了各种代码。例如这个注册方法本来是这样的
<?php namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ public function register(Request $request) { //获取参数 //验证参数 //写入数据库 //return 注册信息 } }
现在有一个需求,就是需要在注册之后给用户发送一个广告邮件,那么,我们绝大数人(包括以前的我)会直接在这后边写代码了
<?php namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ public function register(Request $request) { //获取参数 //验证参数 //写入数据库 //发送广告邮件 // 注册信息 } }
这是比较直观的写法,后来又有需求要发个短信。
<?php namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ public function register(Request $request) { //获取参数 //验证参数 //写入数据库 //发送广告邮件 //发送短信 // 注册信息 } }
然后又有需求,要发IM消息,这样的需求很多。这些方法如果你封装了,可能也就一行代码。
但是,在实际项目中,这个注册方法里面已经加了很多东西。如果多人开发的话各种不方便。然后想到了laravel似乎有这个功能,但是一直都不知道怎么应用,仔细看了一下手册,发现和自己的想法不谋而合。
laravel的事件功能实际上更倾向是一种管理手段,并不是没了它我们就做不到了,只是它能让我们做得更加好,更加优雅。
laravel的事件是一种管理+实现的体现,它首先有一个总的目录,然后我们可以宏观的看到所有的事件,而不需要每次都要打开控制器的方法我们才能知道注册后会发生什么,这一点很重要,非常的方便,我就不按着laravel的顺序来讲,而是按着实际情况来建立这种关系。
现在我们无非就是要在注册之后要做一系列的事情,首先得注册完之后调用一个事件,然后这个事件再做各种各样的事。
<?php namespace App\Http\Controllers; //引入注册事件,我们先引入一个事件类,名字自定义的,之后再一步一步创建 use App\Events\Register; use Illuminate\Http\Request; class UserController extends Controller { public function register(){ //验证参数,service里面写 //写入数据库,repository 资源库层操作model数据,增删改查 //出发事件,以后所有需要注册后要做的事情,都不需要在这里加代码了,我们只需要管理时间就好了, //event方法是laravel自带方法,$uid是外部参数,需要什么添加什么就好了,一般注册之后都有uid $uid = 1; event(new Register($uid)); } // }
找到\app\Providers\EventServiceProvider.php文件。给它添加关系,告诉系统,有人用event()调用了事件之后要被谁监听得到。
<?php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'App\Events\Event' => [ 'App\Listeners\EventListener', ], //注册事件 'App\Events\Register' => [ //监听器,一个事件可以注册多个监听器 //发送广告邮件 'App\Listeners\SendAdMail', //发送短信 'App\Listeners\SendSms', //发送帮助信息 'App\Listeners\SendHelpInfomation' ] ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); Event::listen('TestEvent', function ($foo, $bar) { # }); // } }
这里是注册事件的入口,相当于一个总目录,这样就可以跟注册代码解耦了,以后要加东西我们就不需要再去看注册方法的代码了。
现在注册完之后会触发这个App\Events\Register类,然后这个类会被App\Listeners\SendAdMail、App\Listeners\SendSms、App\Listeners\SendHelpInformation监听得到,我们直接在使用命令生成事件监听类。
php artisan event:generate
例:
<?php namespace App\Listeners; use App\Events\Register; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class SendAdMail { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param Register $event * @return void */ public function handle(Register $event) { //写具体实现功能 } }
一个简单的场景应用使我们能更加透彻的去理解我们在何时需要用到事件以及监听,更加详细的请自行百度或者去参考laravel框架。
发表评论