0

一旦创建了新项目,我想自动将数据分配到属性(即自定义 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
        });
    }
    ...
}

对于 Eloquent 5.7:

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

use Illuminate\Database\Eloquent\Model as Eloquent;

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

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

感谢您的想法!

蒂姆

4

1 回答 1

0

Illuminate\Database\Eloquent\Model::creatingLaravel 框架 5.7 版仍然支持向调度程序注册创建模型事件(可通过Illuminate\Database\Eloquent\Concerns\HasEventstrait获得)。

这种在模型的事件映射中设置事件类的另一种方式允许为创建模型事件调度自定义事件。

在这种情况下,事件类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中注册事件监听器。listen

protected $listen = [
    'App\Events\MessageCreated' => [
        'App\Listeners\AddMessageId',
    ],
];

有可用于创建事件类的内置工具。以这种方式创建的类在App\Events.

运行以下命令引导MessageCreated类;你只需要填写实现。

php artisan make:event MessageCreated

php artisan make:listener AddMessageId
于 2018-11-27T22:02:16.893 回答