Laravel 5 事件的使用

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

事件的创建

  下面我们用artisan来创建一个事件,比如叫CqhTestEvent

php artisan make:event CqhTestEvent

  生成的事件如下

<?php namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
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 App\Handlers\Events;
use App\Events\CqhTestEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;
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 App\Providers;
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider {
	/**
	 * The event handler mappings for the application.
	 *
	 * @var array
	 */
	protected $listen = [
		‘event.name‘ => [
			‘EventListener‘,
		],
        //在这里加上
		‘App\Events\CqhTestEvent‘ => [
			‘App\Handlers\Events\CqhTestEventHandler‘,
		],
	];
...
}

  在这里把事件给添加上,并定义相应处理事件的类(注意,这里是可以针对事件使用多个处理类的,只需要在数组里加上就行了)

  • 在Event::listen()方法中指定
Event::listen(‘App\Events\CqhTestEvent‘, ‘App\Handlers\Events\CqhTestEventHandler‘);

  注意:指定类的时候和路由是一个原理,事件处理默认会调用CqhTestEventHandler的handle方法,如果要指定相应方法,可以加上@方法名,如[email protected]

  只需要在调用事件之前指定即可

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

  我们不可以直接用闭包来处理某个事件,只要在触发事件前定义就可以了,如在EventServiceProvider的boot方法里

Event::listen(‘App\Events\CqhTestEvent‘, function($event)
{
      // 处理事件...
});

  如果定义了多个这样的事件处理,在触发事件后他们都会一并被执行,就相当于jquery里边的bind方法如,

    public function getTest()
    {
        Event::listen(‘App\Events\CqhTestEvent‘, function($event)
        {
            echo ‘触发事件1‘;
        });
        Event::listen(‘App\Events\CqhTestEvent‘, function($event)
        {
            echo ‘触发事件2‘;
        });
        Event::listen(‘App\Events\CqhTestEvent‘, function($event)
        {
            echo ‘触发事件3‘;
        });
        event(new CqhTestEvent());
    }

  上面注册了CqhTestEvent事件的三个处理,运行结果如下

触发事件1触发事件2触发事件3

  同样,和jquery一样,有时候你会希望停止继续传递事件到其他监听器。你可以通过从处理程序return  false 来做到这件事

    public function getTest()
    {
        Event::listen(‘App\Events\CqhTestEvent‘, function($event)
        {
            echo ‘触发事件1‘;
        });
        Event::listen(‘App\Events\CqhTestEvent‘, function($event)
        {
            echo ‘触发事件2‘;
            return false;
        });
        Event::listen(‘App\Events\CqhTestEvent‘, function($event)
        {
            echo ‘触发事件3‘;
        });
        event(new CqhTestEvent());
    }

  运行结果如下

触发事件1触发事件2
时间: 2024-08-06 16:01:33

Laravel 5 事件的使用的相关文章

Laravel之事件

一.事件 事件无处不在,比如用户登录.购买商品.搜索.查看文章,等等,都是事件,有了事件,就有事件监听器,事件监听器监听到事件发生后会执行一些操作,Laravel使用观察者模式来实现这种监听机制.本节我们通过一个简单的示例来讲述在Laravel中如何创建事件类.事件对应的监听器类,以及监听器如何监听事件发生并执行相应操作. 这里我们实现一个添加任务后后写入日志的事件 二.注册事件-监听器 1.我们需要在EventServiceProvider中注册事件与监听器之间的映射关系: protected

Laravel之事件Event

适用场景:记录文章浏览量 php artisan make:event 事件名 示例: php artisan make:event MyEvent Laravel目录\app\Events已经生成MyEvent.php文件 <?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Broadcasting\ShouldBroa

Laravel Model 事件使用注意事项

1 触发条件 1.1 updating 1.1.1 如果字段无变化,不会触发此事件. 1.1.2 除非更改至少一个字段的值 2 事件逻辑不会覆盖 2.1 Trait 中定义事件如下 /** * The boot method. */public static function bootHasArchive(){ static::creating(function ($model) { Log::info(__FILE__); }); static::updating(function ($mod

Laravel事件广播

依赖 laravel(predis). redis. nodejs(ioredis,socket.io)  1.修改config\app.php providers数组   添加    'Illuminate\Broadcasting\BroadcastServiceProvider', 2.修改广播驱动方式为 config\broadcasting.php 'default' => env('BROADCAST_DRIVER', 'redis'), 改为redis驱动 使用redis作为php

Laravel事件Event

适用场景:记录文章浏览量 1 php artisan make:event 事件名 示例: 1 php artisan make:event MyEvent Laravel目录\app\Events已经生成MyEvent.php文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <?php namespace App\Events; use App\Events\Eve

laravel进阶系列--通过事件和事件监听实现服务解耦

简介 Laravel 事件提供了简单的观察着模式实现,允许你订阅和监听应用中的事件.事件类通常存放在 app/Events 目录. 监听器存放在 app/Listeners. 如果你在应用中没有看到这些目录,不要担心,他们会在你使用Artisan命令生成事件和 监听器的时候自动创建. 事件为应用功能模块解耦提供了行之有效的解决方法,因为单个事件可以有多个监听器而这些监听器之间并不相互依赖. 例如,你可能想要在每次订单发送时给用户发送一个Slack通知,有了事件之后,你大可不必将订单处理代码和Sl

Laravel框架中的event事件操作

有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过.下面就事件.事件监听举一个很简单的例子你就会发现. ? 这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听

【laravel】Eloquent 模型事件和监听方式

所有支持的模型事件 在 Eloquent 模型类上进行查询.插入.更新.删除操作时,会触发相应的模型事件,不管你有没有监听它们.这些事件包括: retrieved 获取到模型实例后触发 creating 插入到数据库前触发 created 插入到数据库后触发 updating 更新到数据库前触发 updated 更新到数据库后触发 saving 保存到数据库前触发(插入/更新之前,无论插入还是更新都会触发) saved 保存到数据库后触发(插入/更新之后,无论插入还是更新都会触发) deleti

laravel 事件的使用案例

以下是我对事件使用的一些记录 创建事件 执行以下命令,执行完成后,会在 app\Events 下面出现一个 DeleteEvent.php 文件,事件就在次定义 php artisan make:event DeleteEvent 编写事件 #DeleteEvent.php <?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contract