zoukankan      html  css  js  c++  java
  • 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
    
     
     
  • 相关阅读:
    Mybatis--->第五节注解完成增删改查
    Mybatis--->新增新功能报错,以前都正常,突然报错
    Mybatis--->limit分页查询
    固定套路--->log4j日志运用-Maven
    Mybatis第三节优化别名--->user
    Mybatis入门第二节--->优化
    Mybatis 报错 java.io.IOException: Could not find resource mybatis-config.xml
    学习Java的第十二天
    学习Java的第十一天
    学习Java的第十天
  • 原文地址:https://www.cnblogs.com/chenqionghe/p/4884390.html
Copyright © 2011-2022 走看看