美文网首页laravel核心
laravel事件监听--模型事件新特性

laravel事件监听--模型事件新特性

作者: 云龙789 | 来源:发表于2017-07-07 00:57 被阅读767次

暂时失败,搞定再修改

  • 我们使用一个post模型
<?php
namespace App;
use App\Events\PostWasPublished;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $events = [
        'created' => PostWasPublished::class  , //key就是事件的名字,值就是触发的事件。这个事件可以是一个完整的类
    ];
}

当执行到这个model里面created方法的时候,会触发PostWasPublished事件。这个事件也就是PostWasPublished类里面的代码。它背后的监听着,其实就是PostWasPublishedListenr类里面的代码

然后我们去EventServiceProvider类里面修改$listen属性

protected $listen = [
        'App\Events\PostWasPublished' => [
            'App\Listeners\PostWasPublishedListenr',
// 如果一个事件需要发送给多个监听者,我们只需要把监听的类写入这个数组里面
        ],
    ];

此时执行php artisan event:generate会生成两个类
Events文件中生成PostWasPublished类,Listeners文件中生成PostWasPublishedListenr类,也就是上面$listen属性定义的两个类。

生成两个类

PostWasPublished发布类

<?php

namespace App\Events;
use App\Post;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class PostWasPublished
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $post;   // 注意此处要被继承使用,必须用publish
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Post $post)
    {
        $this->post = $post;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

PostWasPublishedListenr监听类

<?php

namespace App\Listeners;

use App\Events\PostWasPublished;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class PostWasPublishedListenr
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  PostWasPublished  $event
     * @return void
     */
    public function handle(PostWasPublished $event)
    {

// 因为监听类PostWasPublished里面注入了Pos这个model类,所以我们可以直接使用Post里面的函数
        dump($event->post->toArray());
    }
}

路由

注意此处用的是 create  而不是created
Route::get('/', function () {
   return \App\User::create(['name'=>'name','email'=>'62em11ail3@qq.com','password'=>'password']);
});


也可以直接在路由里使用event全局函数做触发
以下方式跟User的模型里面 $events 属性就没有关系了,这是直接触发的
这种打方式会触发两次事件
Route::get('/', function () {
    $user = \App\User::create(['name'=>'name','email'=>'652em11ail3@qq.com','password'=>'password']);
    event(new \App\Events\PostPublished($user));
});

这种方式会触发一次事件
Route::get('/', function () {
    $user = \App\User::find(2);
    event(new \App\Events\PostPublished($user));
});
图片.png
  • 但是可以监听的事件只有以下函数中的那些
图片.png

相关文章

  • laravel队列、消息通知和观察者模式的理解

    推荐设计模式-PHP观察者设计模式laravel事件监听--模型事件新特性深入了解laravel消费队列的两种工作...

  • laravel事件监听--模型事件新特性

    参考视频 暂时失败,搞定再修改 我们使用一个post模型 然后我们去EventServiceProvider类里面...

  • laravel 模型事件监听

    所有支持的模型事件在 Eloquent 模型类上进行查询、插入、更新、删除操作时,会触发相应的模型事件(关于事件我...

  • 事件

    事件 -- 监听器 -- 文章点击率 Laravel 5.3 事件 和 监听器 事件类 存放位置:一般在 app/...

  • 5.4Laravel事件

    事件 更多详细请参看laravel手册 事件/监听器 事件类存放位置:app/Event 目录中 监听器存放位置:...

  • Laravel 模型事件入门

    Laravel 模型事件允许你监听模型生命周期内的多个关键点,甚至可以在阻止一个模型的保存或者删除。 Larave...

  • 关于Android的几种事件处理

    Android事件处理通常和控件相结合,通常有以下几种事件处理模型:•(一)事件监听的处理模型 • (二)基于监听...

  • 关于Android的几种事件处理

    Android事件处理通常和控件相结合,通常有以下几种事件处理模型:•(一)事件监听的处理模型 • 二)基于监听的...

  • 事件驱动模型

    观察者模式与事件驱动模型 观察者模式: 事件驱动模型 2.事件驱动模型 事件源 持有监听器列表,或者各种类型监听器...

  • laravel事件

    Laravel 事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。 事件和监听都是阻塞式应用,如果耗时...

网友评论

    本文标题:laravel事件监听--模型事件新特性

    本文链接:https://www.haomeiwen.com/subject/oggkhxtx.html