【问题标题】:Eloquent 5.7: Creation-EventEloquent 5.7:创建事件
【发布时间】:2018-11-27 21:15:47
【问题描述】:

我想在创建新项目后立即自动将数据分配到属性(即自定义 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,所以我不知道如何继续。

感谢您的想法!

提姆

【问题讨论】:

    标签: events eloquent event-handling illuminate-container


    【解决方案1】:

    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 中,在listen 属性中注册事件监听器。

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

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

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

    php artisan make:event MessageCreated
    
    php artisan make:listener AddMessageId
    

    【讨论】:

    • 感谢您的支持。我按照建议创建了这个类(如果我直接引用它,我可以调用它),但是事件 (created) 本身并没有调用这个类。您提出的命令 (php artisan make:event MessageCreated) 会产生错误,因为我没有安装 artisan。有什么解决办法吗?
    • 我在 5.7 中进行了检查,these model events 可以在 Model::boot 上注册。但是,要回答有关未安装 artisan 的问题,您可以手动创建事件及其侦听器(我提供了这些事件的源代码),然后在 EventServiceProvider 中注册它们。您可能需要也可能不需要使用 composer 重新生成自动加载类映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2021-10-18
    相关资源
    最近更新 更多