Laravel 5 事件的使用

  事件类通常被保存在 app/Events 目录下,而它们的处理程序则被保存在 app/Handlers/Events 目录下。

事件的创建

  下面我们用artisan来创建一个事件,比如叫CqhTestEvent
php artisan make:event CqhTestEvent
  生成的事件如下
<?php namespace AppEvents;
use AppEventsEvent;
use IlluminateQueueSerializesModels;
class CqhTestEvent extends Event {
	use SerializesModels;
	/**
	 * Create a new event instance.
	 *
	 * @return void
	 */
	public function __construct()
	{
	}
}

事件的触发

  • 方法一:可以直接用event()函数来触发事件,如下
event(new CqhTestEvent());
  • 方法二:也可以用Event facade来触发,如下
$response = Event::fire(new CqhTestEvent());
fire 方法返回一个响应的数组,让你可以用来控制你的应用程序接下来要有什么反应。
 

事件的处理

  事件处理的方法可以分别两种,分别是类和闭包。
  这里我的处理类中叫CqhTestEventHandler,下面我们来用artisan来创建这个处理类
php artisan handler:event CqhTestEventHandler --event=CqhTestEvent
  然后在app/Handlers/Events文件下会生成CqhTestEventHandler.php,结构如下
<?php namespace AppHandlersEvents;
use AppEventsCqhTestEvent;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldBeQueued;
class CqhTestEventHandler {
	/**
	 * Create the event handler.
	 *
	 * @return void
	 */
	public function __construct()
	{
		//
	}
	/**
	 * Handle the event.
	 *
	 * @param  CqhTestEvent  $event
	 * @return void
	 */
	public function handle(CqhTestEvent $event)
	{
		//
	}
}
  然后我们在handle方法里加上一句
	public function handle(CqhTestEvent $event)
	{
		//
		echo 'chenqionghe的事件被处理了';
	}
  这样,我们的简单的对应事件的处理就完成了
  然后, 要指定相应事件的处理类也有两种方式,事件服务中指定和Event::listen()方法指定

  方法一:指定要处理的类

  • 在EventServiceProvider的boot方法中指定要处理
  然后,我们需要把这个事件注册到系统服务里边,在app/Providers文件夹里有个EventServiceProvider.php我们,打开他,找到相应的listen属性,加上
  如下
<?php namespace AppProviders;
use IlluminateContractsEventsDispatcher as DispatcherContract;
use IlluminateFoundationSupportProvidersEventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider {
	/**
	 * The event handler mappings for the application.
	 *
	 * @var array
	 */
	protected $listen = [
		'event.name' => [
			'EventListener',
		],
        //在这里加上
		'AppEventsCqhTestEvent' => [
			'AppHandlersEventsCqhTestEventHandler',
		],
	];
...
}
  在这里把事件给添加上,并定义相应处理事件的类(注意,这里是可以针对事件使用多个处理类的,只需要在数组里加上就行了)
  • 在Event::listen()方法中指定
Event::listen('AppEventsCqhTestEvent', 'AppHandlersEventsCqhTestEventHandler');
  注意:指定类的时候和路由是一个原理,事件处理默认会调用CqhTestEventHandler的handle方法,如果要指定相应方法,可以加上@方法名,如CqhTestEventHandler@doEvent
  只需要在调用事件之前指定即可

  方法二:用闭包来处理事件

  我们不可以直接用闭包来处理某个事件,只要在触发事件前定义就可以了,如在EventServiceProvider的boot方法里
Event::listen('AppEventsCqhTestEvent', function($event)
{
      // 处理事件...
});
  如果定义了多个这样的事件处理,在触发事件后他们都会一并被执行,就相当于jquery里边的bind方法如,
    public function getTest()
    {
        Event::listen('AppEventsCqhTestEvent', function($event)
        {
            echo '触发事件1';
        });
        Event::listen('AppEventsCqhTestEvent', function($event)
        {
            echo '触发事件2';
        });
        Event::listen('AppEventsCqhTestEvent', function($event)
        {
            echo '触发事件3';
        });
        event(new CqhTestEvent());
    }
  上面注册了CqhTestEvent事件的三个处理,运行结果如下
触发事件1触发事件2触发事件3
  同样,和jquery一样,有时候你会希望停止继续传递事件到其他监听器。你可以通过从处理程序return  false 来做到这件事
    public function getTest()
    {
        Event::listen('AppEventsCqhTestEvent', function($event)
        {
            echo '触发事件1';
        });
        Event::listen('AppEventsCqhTestEvent', function($event)
        {
            echo '触发事件2';
            return false;
        });
        Event::listen('AppEventsCqhTestEvent', function($event)
        {
            echo '触发事件3';
        });
        event(new CqhTestEvent());
    }
  运行结果如下
触发事件1触发事件2
 
 
原文地址:https://www.cnblogs.com/chenqionghe/p/4884390.html