Laravel 项目中事件控制的体会--综合应用 trait 多态

本文探讨了在Laravel框架中使用Trait实现多态关联,并在模型删除时自动删除相关联档案的方法。通过具体代码示例,展示了Trait、模型及观察者的事件监听顺序及其相互独立性。

1 我们想像有这样的需求

1.1 应用中有两个类。其一是 荣誉(Honour)其一是 档案(Archive)Honour 和 Arhcive 是多态关联。即拥有档案属性的不只荣誉类,还有更多的类去关联,如:新闻、人物等,一个应用类拥有一个档案类。

1.2 为了代码的复用,我们建立一个 Trait, HasArchive 

1.3 功能预期:模型删除时,在 Trait 中,将其所关联的 archive 一并删除。同时,不能影响模型中删除事件的其他逻辑「可能还有权限判断,下级关联删除等相关处理工作」。

2 事件测试

2.1 Traits/HasArchive.php

/**
     * The boot method.
     */
    public static function bootHasArchive()
    {
        /**
         * Handle the "deleting" event.
         */
        static::deleting(function ($model) {
            $class = get_class($model);
            info("HasArchive Trait deleting {$class} {$model->id}");
            if ($archive = $model->archive) {
                $archive->delete();
            }
        });
        
        static::created(function ($model) {
            info(__CLASS__ . __METHOD__);
        });
        
    }

2.2 Honour.php

use HasArchive;

protected
static function boot() { parent::boot(); static::created(function ($honour) { info(__CLASS__ . __METHOD__); }); }

2.3 HonourObserver.php

/**
     * Handle the honour "created" event.
     *
     * @param  \App\Honour  $honour
     * @return void
     */
    public function created(Honour $honour)
    {
        info(__CLASS__ . __METHOD__);
    }

2.4 Archive.php

protected static function boot()
    {
        parent::boot();
        static::created(function ($archive) {
            info(__CLASS__ . __METHOD__);
        });
    }

2.5 ArchiveObserver.php

/**
     * Handle the archive "created" event.
     *
     * @param  \App\Archive  $archive
     * @return void
     */
    public function created(Archive $archive)
    {
        info(__CLASS__. __METHOD__);
    }

2.6 在 tinker 中执行测试语句

>>> Honour::create()->archive()->create()

日志输出如下:

[2019-06-06 09:41:17] local.INFO: App\HonourApp\Traits\{closure}
[2019-06-06 09:41:17] local.INFO: App\HonourApp\{closure}
[2019-06-06 09:41:17] local.INFO: App\Observers\HonourObserverApp\Observers\HonourObserver::created
[2019-06-06 09:41:17] local.INFO: App\ArchiveApp\{closure}
[2019-06-06 09:41:17] local.INFO: App\Observers\ArchiveObserverApp\Observers\ArchiveObserver::created

2.7 测试结论

2.7.1 「Trait, Model, Observer」三个地方的事件侦听互不影响

2.7.1 事件执行的顺利: Trait => Model => Observer

转载于:https://www.cnblogs.com/mouseleo/p/10983416.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值