口才5.7:创造活动

时间:2018-11-27 21:15:47

标签: events eloquent event-handling illuminate-container

创建新项目后,我想自动将数据分配给属性(即自定义ID号)。

我知道,不幸的是,在Eloquent 5.7下不可能再在下一个框中给出示例了!

在Eloquent 5.7中不可用:

use Illuminate\Database\Eloquent\Model as Eloquent;

class Message extends Eloquent {
    ...
    public static function boot() {
        parent::boot();

        self::creating(function ($model) {
            $model->ID = 1234; // 1234 shall be replaced later by a function
        });
    }
    ...
}

对于口才5.7:

据我了解,我现在必须定义一个单独的类,并将其在模型中链接到所请求的事件,如下所示:

use Illuminate\Database\Eloquent\Model as Eloquent;

class Message extends Eloquent {
    ...
    protected $dispatchesEvents = [
        'creating' => MessageCreated::class,
    ];
    ...
}

但是我现在的问题是,我不知道如何创建这个额外的类“ MessageCreated”。我已阅读和看到的所有教程都使用了全套Laravel(使用ARTISAN做一些终端命令...)。但是在我的环境中,我仅安装了Illuminate / Eloquent,因此我不知道如何进行。

感谢创意!

蒂姆

1 个答案:

答案 0 :(得分:0)

  Laravel框架5.7版仍支持

Illuminate\Database\Eloquent\Model::creating(可通过Illuminate\Database\Eloquent\Concerns\HasEvents trait使用)向调度程序注册创建模型事件。

通过另一种在模型的事件图中设置事件类的方式,可以为创建模型的事件调度自定义事件。

在这种情况下,事件类MessageCreated只是一个PHP类,其构造函数通过Eloquent模型实例传递。

这意味着您决定保留它的地方留待您判断。

例如,假设MessageCreated.php被添加到app/Events命名空间的App\Events文件夹中;其内容将是

<?php
// app/Events/MessageCreated.php

namespace App\Events;

use App\Message;

final class MessageCreated
{
    public function __construct(Message $message) {
        $this->message = $message;
    }

}

在这种情况下,可以在MessageCreated事件的构造函数中添加消息ID;我不能轻易在此完成它,因为事件不应该改变其有效载荷。

可以向EventServiceProvider注册侦听器以处理此类事件。

可以在app/Listeners文件夹中创建侦听器。 例如

<?php
// app/Listeners/AddMessageId.php

namespace App\Listeners;

class AddMessageId
{
    public function handle($event)
    {
        $event->message->ID = 1234;
    }
}

app/providers/EventServiceProvider.php的{​​{1}}属性中注册事件监听器。

listen

有内置工具可用于创建事件类。通过这种方式创建的类在protected $listen = [ 'App\Events\MessageCreated' => [ 'App\Listeners\AddMessageId', ], ]; 中进行命名空间。

运行以下命令将引导App\Events类;您只需要填写实施即可。

MessageCreated