• Laravel 项目中事件控制的体会--综合应用 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  AppHonour  $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  AppArchive  $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: AppHonourAppTraits{closure}
    [2019-06-06 09:41:17] local.INFO: AppHonourApp{closure}
    [2019-06-06 09:41:17] local.INFO: AppObserversHonourObserverAppObserversHonourObserver::created
    [2019-06-06 09:41:17] local.INFO: AppArchiveApp{closure}
    [2019-06-06 09:41:17] local.INFO: AppObserversArchiveObserverAppObserversArchiveObserver::created

    2.7 测试结论

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

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

  • 相关阅读:
    Jquery 跨域请求JSON数据问题
    js定时器实现图片轮播
    Redis数据一致性
    Redis缓存击穿、缓存穿透、缓存雪崩
    数据库连接池druid连接mysql数据库‘链路断开’问题
    Mysql启动错误: Can’t create test file xxx lower-test
    DB2-表空间
    DB2-Schema
    DB2-数据库
    DB2-实例
  • 原文地址:https://www.cnblogs.com/mouseleo/p/10983416.html
Copyright © 2020-2023  润新知