资讯专栏INFORMATION COLUMN

使用 Laravel 的 监听者模式实现缓存机制的松散耦合

notebin / 763人阅读

摘要:有缓存的话就走缓存,然后那边的模块内部实现一个包括过期时间呀啥啥的缓存机制,没有收到缓存模块的响应的时候就继续走原来的应用逻辑,一样可以正常响应。因为我们是要实现应用逻辑与缓存逻辑的解耦,所以正常应用逻辑内是不能有对那些缓存的依赖的。

原文地址:https://prinzeugen.net/use-ob...

唔,我也不知道我接下来要讲的东西是不是配得上这个题目,总之就是分享一下我在搞 Blessing Skin Server 的缓存与插件机制时的一些经验(大佬们就请忽略吧)

既然要实现松散耦合的缓存机制,那就是要做到有没有缓存都没事。有缓存的话就走缓存,然后那边的模块内部实现一个包括过期时间呀啥啥的缓存机制,没有收到缓存模块的响应的时候就继续走原来的应用逻辑,一样可以正常响应。

因为我们是要实现应用逻辑与缓存逻辑的解耦,所以正常应用逻辑内是不能有对那些缓存的依赖的。那么我们要通过什么来和缓存模块通信呢?巧的是,Laravel 正好提供了基于 Event 和 Listener 的观察者模式,我们就可以用这种设计模式来解耦缓存模块。

首先,我们在即将获取一个可能需要缓存的数据之前,触发一个 GetDataEvent(举个栗子),接下来判断这个 Event 是否返回了响应,如有则使用响应的内容,没有的话就继续正常的应用逻辑来获取数据。

譬如说,我们需要把皮肤的预览图给缓存下来,而不是每次都去生成:

texture = $texture;
        $this->size    = $size;
    }
}
// 控制器中的方法
public function preview($tid, $size = 250)
{
    // 触发事件
    $responses = Event::fire(new GetSkinPreview($t, $size));

    // 当然,如果你有多个 Listener 的话,在这里你可能需要遍历 Event 所返回的响应
    if (isset($responses[0]) && $responses[0] instanceof SymfonyComponentHttpFoundationResponse) {
        // 这个返回的响应类型是看你自己对 Event 的需求的
        // 比如这里我们需要 Listener 返回一个 Http 响应流
        return $responses[0];
    } else {
        /* 原来业务逻辑中的生成预览 */

        return Response::png();
    }
}

而这个 GetDataEvent,我们是可以注册 Listener 上去的,具体如何添加 Event 和 Listener 请参考 Laravel 文档。假设我们在这里给这个事件注册了一个 CacheDataListener,那么在 GetDataEvent 这个事件在应用逻辑中被触发的时候,Laravel 的 Event Dispatcher 就会把事件分发到我们刚刚注册的监听器里,我们就可以在监听器的 handle 方法中处理缓存逻辑并返回缓存后的数据了。

texture->tid;

        if (!Storage::disk("cache")->has("preview/$tid")) {
            /* 这里生成预览并保存到缓存文件 */
        }

        return Response::png(Storage::disk("cache")->get("preview/$tid"));
    }
}

这样下来,我们就可以让应用逻辑和缓存逻辑(差不多)完全分离开来,想要使用其他的缓存驱动,例如 Redis 的话,只要新建一个 Listener 并监听 GetDataEvent 就可以了。你甚至可以把缓存机制放到插件里去,而这也就是我本来的目的(笑)

以上只是我的个人见解,如果有什么不对的地方,还请大佬们多指教啊 (つд⊂)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30443.html

相关文章

  • 《PHP 设计模式》翻译完毕

    摘要:创建型设计模式通过控制这个对象的创建方式来解决此问题。通过这样做,这些模式增加了执行此通信的灵活性。已于年月日翻译完毕,参与用户人,详细列表请见参与译者。 showImg(https://segmentfault.com/img/bV6R8Q?w=1024&h=683); 翻译进度请见:https://laravel-china.org/doc... 设计模式不仅代表着更快开发健壮软件...

    verano 评论0 收藏0
  • Laravel核心解读--观察模式

    摘要:模式定义观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。 观察者模式 Laravel的Event事件系统提供了一个简单的观察者模式实现,能够订阅和监听应用中发生的各种事件,在PHP的标准库(SPL)里甚至提供了三个接口SplSubject, SplObserver, SplObjectStorage来让开发者更容易地实现观...

    lei___ 评论0 收藏0
  • Laravel最佳实践--事件驱动编程

    摘要:事件驱动编程是图形用户界面和其他应用程序例如应用程序中使用的主要范例,用于执行某些操作来响应用户输入。我们来看一下事件驱动编程带来的收益。现在让我们看看采用事件驱动编程方法如何实现上述相同的功能。 在这篇文章中我们将了解到什么是事件驱动编程以及在Laravel中如何开始构建一个事件驱动应用,同时我们还将看到如何通过事件驱动编程来对应用程序的逻辑进行解耦。 在开始之前,先说明一下这篇文章...

    Drummor 评论0 收藏0
  • PHPer、Laravel 面试可能会遇到问题及答案

    摘要:如何实现持久化持久化,将在内存中的的状态保存到硬盘中,相当于备份数据库状态。相当于备份数据库接收到的命令,所有被写入的命令都是以的协议格式来保存的。 最近社区里面有一篇文章引起了最多程序猿的关注,Laravel、PHPer 面试可能会遇到的问题,看评论区不少小伙伴们被难倒,对于一些问题同样难倒了我(其实有很多啦),趁着周末有空,又总结梳理了一遍,顺便来答一波题。由于个人技术水平有限,答...

    livem 评论0 收藏0
  • PHPer、Laravel 面试可能会遇到问题及答案

    摘要:如何实现持久化持久化,将在内存中的的状态保存到硬盘中,相当于备份数据库状态。相当于备份数据库接收到的命令,所有被写入的命令都是以的协议格式来保存的。 最近社区里面有一篇文章引起了最多程序猿的关注,Laravel、PHPer 面试可能会遇到的问题,看评论区不少小伙伴们被难倒,对于一些问题同样难倒了我(其实有很多啦),趁着周末有空,又总结梳理了一遍,顺便来答一波题。由于个人技术水平有限,答...

    fanux 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<