小白巷之Laravel5的新特性 - Events & Handlers

## Laravel5新特性 - Events & Handlers

事件是系统开发中非常重要的一部分,可以在一次编码后只需修改事件规则,无需更改流程代码。比如商城站,用户在登陆之后,系统会做两件事情:   
1. 给新用户发送站内信,欢迎新用户;
2. 发送欢迎邮件;  
如果按照原始的程序,会在注册完成之后触发一系列动作函数。但如果后期站内除了折扣码,我们不得不修改核心流程,添加折扣码处理函数。每添加一个动作必须修改核心流程,显然不符合最佳代码规范,我们可以将用户注册完成之后触发的一系列动作封装起来,于是便出现了事件。  

laravel4中已经有了事件的概念,不过目录文件并没有默认创建,需要我们自己创建,再在composer配置文件中新加事件目录即可,具体操作大家可以查看laravel4官方文档。
Laravel4中事件的触发依赖事件的名称:

    $response = Event::fire('auth.login', array($user));

而Laravel5则不再使用这种方式,通常直接new一个php对象;
我们直接上栗子:

### 第一步:使用命令新建Event

    php artisan make:event CacheEvent 

将会创建如下Event:

    <?php namespace App\Events;
    
    use App\Events\Event;
    
    use Illuminate\Queue\SerializesModels;
    
    class CacheEvent extends Event {
    
        use SerializesModels;
    
        /**
         * Create a new event instance.
         *
         * @return void
         */
        public function __construct()
        {
            //
        }
    
    }

### 第二步:使用命令新建Handler

    php artisan handler:event CacheRouteHandler --event="CacheEvent"

将会创建以下Handler

    <?php namespace App\Handlers\Events;
    
    use App\Events\CacheEvent;
    
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldBeQueued;
    
    class CacheRouteHandler {
    
        /**
         * Create the event handler.
         *
         * @return void
         */
        public function __construct()
        {
            //
        }
    
        /**
         * Handle the event.
         *
         * @param  ThingWasDone  $event
         * @return void
         */
        public function handle(CacheEvent $event)
        {
            //初始化一些必要的缓存
        }
    
    }

大家发现自动生成event已经做好了方法注入,当然你也可以在construct函数里面注入绑定,然后在定义全局对象即可;

### 第三步:绑定Event和Handler
ok,创建好了event和Handler,我们还需要将它们绑定起来。文件在`app\Providers\EventServiceProvider`:

    // app\Providers\EventServiceProvider
    protected $listen = [
        'App\Events\CacheEvent' => [
            'App\Handlers\Events\CacheRouteHandler',
            ...
        ],
    ];

### 第四步:Fire

    \Event::fire(new App\Events\CacheEvent());

ok,截止目前,我们已经会使用了laravel5中的事件。当然,事件也是可以绑定参数的,网上找到一个参数传递的栗子,大家可以参考下:

    class SidebarEvent {
    
        public $first;
        public $second;
        public $third;
    
        public function __construct($first, $second, $third) {
            $this->first = $first;
            $this->second = $second;
            $this->third = $third;
        }
    
        public function getData()
        {
            return [
                'first' => $this->first,
                'second' => $this->second,
                'third' => $this->third,
            ];
        }
    }

获取参数

    class SidebarNavigationListener
    {
        public function handle(SidebarEvent $event)
        {
            dd($event->getData());
        }
    }

使用参数

    Event::fire(new SidebarEvent('1', '2', '3'));

  





posted @ 2015-04-21 07:53  jroy  阅读(892)  评论(0编辑  收藏  举报