创建新项目后,我想自动将数据分配给属性(即自定义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,因此我不知道如何进行。
感谢创意!
蒂姆
答案 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