• 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

  • 相关阅读:
    【tips】Clion添加Qt gui绘制快捷方式
    conda配置安装pytorch tensorflow-gpu
    用当前最新版vs2019编译opencv最新版4.3.0遇到的问题---
    cuda报错: nvcc fatal : Host compiler targets unsupported OS
    C++中结构体与类的区别(struct与class的区别)
    cmake
    Windows 下配置Boost MPI
    VC----MFC对象的创建总结
    VC++、MFC最好的开源项目
    机械设计人员怎么学习电控?
  • 原文地址:https://www.cnblogs.com/mouseleo/p/10983416.html
Copyright © 2020-2023  润新知