Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
聊聊Laravel中怎么使用 PHP 的装饰器模式_创想鸟

聊聊Laravel中怎么使用 PHP 的装饰器模式

如何在 laravel 中使用 php 的装饰器模式?下面本篇文章就来给大家介绍一下laravel中使用php装饰器模式的方法,希望对大家有所帮助!

聊聊Laravel中怎么使用 PHP 的装饰器模式

设计模式对每个开发人员都很重要。它解决了您构建的每个项目中非常常见的问题。

装饰器模式定义:

它可以帮助您在一个对象上添加额外的行为,而又不影响同一类中的其他对象。

维基百科:

装饰器模式是一种设计模式,它允许动态地将行为添加到单个对象,而不会影响同一类中其他对象的行为

问题

假设我们有一个Post模型

立即学习“PHP免费学习笔记(深入)”;

class Post extends Model{    public function scopePublished($query) {        return $query->where('published_at', '<=', 'NOW()');    }}

在我们的PostsController中,我们有如下的index方法

class PostsController extends Controller{    public function index() {        $posts = Post::published()->get();        return $posts;    }}

为了缓存帖子并避免每次我们需要列出帖子时都查询数据库,我们可以执行以下操作

class PostsController extends Controller{    public function index() {        $minutes = 1440; # 1 day        $posts = Cache::remember('posts', $minutes, function () {            return Post::published()->get();        });        return $posts;    }}

现在,我们将帖子缓存1天。但看看代码,控制器了解了太多。它知道我们缓存了多少天,它自己缓存了对象。

同样,假设您正在为HomePageController的Tag,Category,Archives实现相同的功能。阅读和维护的代码太多了。

仓库模式

在大多数情况下,仓库模式是连接到装饰器模式。

首先,让我们使用仓库模式分离获取帖子的方式,创建具有以下内容的app/Repositories/Posts/PostsRepositoryInterface.php

namespace AppRepositoriesPosts;interface PostsRepositoryInterface {    public function get();    public function find(int $id);}

在同个目录下创建具有下面内容的 PostsRepository

namespace AppRepositoriesPosts;use AppPost;class PostsRepository implements PostsRepositoryInterface{    protected $model;    public function __construct(Post $model) {        $this->model = $model;    }    public function get() {        return $this->model->published()->get();    }    public function find(int $id) {        return $this->model->published()->find($id);    }}

回到PostsController并将更改应用为

namespace AppHttpControllers;use AppRepositoriesPostsPostsRepositoryInterface;use IlluminateHttpRequest;class PostsController extends Controller{    public function index(PostsRepositoryInterface $postsRepo) {        return $postsRepo->get();    }}

控制器变得健康,知道足够的细节来完成工作。

在这里,我们依靠 Laravel 的 IOC 注入 Posts 接口的具体对象来获取我们的帖子

无阶未来模型擂台/AI 应用平台 无阶未来模型擂台/AI 应用平台

无阶未来模型擂台/AI 应用平台,一站式模型+应用平台

无阶未来模型擂台/AI 应用平台 35 查看详情 无阶未来模型擂台/AI 应用平台

我们需要做的就是告诉Laravel的IOC使用接口时要创建哪个类。

在你的 app/Providers/AppServiceProvider.php 添加绑定方法

namespace AppProviders;use AppRepositoriesPostsPostsRepositoryInterface;use AppRepositoriesPostsPostsRepository;use IlluminateSupportServiceProvider;class AppServiceProvider extends ServiceProvider{    public function register()    {        $this->app->bind(PostsRepositoryInterface::class,PostsRepository::class);    }}

现在无论何时我们注入PostsRepositoryInterface Laravel 都会创建 PostsRepository 的实例并将其返回。

通过装饰器实现缓存

我们在一开始就说过,装饰器模式允许将行为添加到单个对象,而不会影响同一类中的其他对象。

在这里缓存是行为,对象/类是 PostsRepository

让我们在 app/Repositories/Posts/PostsCacheRepository.php 中创建具有以下内容的PostsCacheRepository

namespace AppRepositoriesPosts;use AppPost;use IlluminateCacheCacheManager;class PostsCacheRepository implements PostsRepositoryInterface{    protected $repo;    protected $cache;    const TTL = 1440; # 1 day    public function __construct(CacheManager $cache, PostsRepository $repo) {        $this->repo = $repo;        $this->cache = $cache;    }    public function get() {        return $this->cache->remember('posts', self::TTL, function () {            return $this->repo->get();        });    }    public function find(int $id) {        return $this->cache->remember('posts.'.$id, self::TTL, function () {            return $this->repo->find($id);        });    }}

在这个类中,我们接受 Caching 对象和 PostsRepository 对象,然后使用类(装饰器)将缓存行为添加到 PostsReposiory 实例。

我们可以使用相同的示例将HTTP请求发送到某些服务,然后在失败的情况下返回模型。我相信您会从该模式以及它是如何轻松添加行为中受益。

最后一件事是修改 AppServiceProvider 接口绑定以创建 PostsCacheRepository 实例而不是PostsRepository

namespace AppProviders;use AppRepositoriesPostsPostsRepositoryInterface;use AppRepositoriesPostsPostsCacheRepository;use IlluminateSupportServiceProvider;class AppServiceProvider extends ServiceProvider{    public function register()    {        $this->app->bind(PostsRepositoryInterface::class,PostsCacheRepository::class);    }}

现在再次检查文件,您会发现它非常易于阅读和维护。同样,它也是可测试的,如果您决定在某个时候删除缓存层。您只需在AppServiceProvider中更改绑定即可。无需额外更改。

结论

我们学习了如何使用修饰器模式缓存模型我们展示了仓库模式如何连接到修饰器模式依附注入和Laravel IOC如何使我们的生活变得轻松laravel组件功能强大

希望您喜欢阅读本文。它向您展示了强大的设计模式,以及如何使您的项目易于维护和管理

原文地址:https://dev.to/ahmedash95/design-patterns-in-php-decorator-with-laravel-5hk6

【相关推荐:laravel视频教程】

以上就是聊聊Laravel中怎么使用 PHP 的装饰器模式的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/478048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
js提示框怎么弄
上一篇 2025年11月8日 10:12:54
Win11如何优化电池续航 Win11笔记本电池优化技巧分享
下一篇 2025年11月8日 10:12:58

相关推荐

  • Grok官方网站直达页_Grok官网官方网页版入口

    Grok官网官方网页版入口为https://grok.com,用户可通过该网站访问网页端服务,支持跨设备同步;同时可下载移动应用或在X平台内使用Grok功能。未订阅用户可体验基础功能,Premium及Premium+需通过X平台订阅,SuperGrok则仅在官网提供,具备更强数据处理能力。账户升级后…

    2026年9月22日
    600
  • PHP如何利用缓存优化实时输出_PHP实时输出与缓存结合优化

    PHP实时输出需结合输出缓冲控制与flush()强制推送,同时考虑服务器和浏览器缓存影响;2. 长时间任务应使用APCu或Redis缓存频繁数据,避免重复计算;3. 动态页面可采用分块输出与片段缓存策略,静态内容从缓存读取,动态部分边生成边输出;4. 更优方案是通过异步任务与Redis存储进度,前端…

    2026年9月22日
    000
  • VS Code中Dockerized PHP项目:解决PHP版本冲突的教程

    本教程旨在解决在VS Code中开发Dockerized PHP项目时,VS Code默认识别宿主机PHP版本而非容器内PHP版本的问题。核心解决方案是利用VS Code的Remote – Containers扩展,实现直接在Docker容器内部进行代码开发,从而确保VS Code及其所…

    2026年9月22日
    200
  • PHP each() 函数的替代方案:自定义实现与常见错误修正

    本文探讨了PHP中已废弃的each()函数的替代方案。针对常见的自定义实现,如myEach(),文章详细指出了其在返回数组结构中常犯的错误,并提供了正确的代码示例,以确保替代函数能够模拟each()的预期行为,帮助开发者编写更健壮、兼容未来的PHP代码。 理解 each() 函数及其废弃背景 在PH…

    2026年9月22日
    000
  • 解决PHP应用中本地文件更新后网页视图不刷新的缓存问题

    本文探讨了PHP应用中,本地JSON或图片文件更新后,网页视图无法实时刷新的常见问题。核心原因在于浏览器缓存机制。文章将提供多种解决方案,包括强制刷新、隐身模式诊断、以及通过URL参数、服务器配置(.htaccess)和文件版本控制来有效管理缓存,确保用户始终获取最新数据。 理解问题:本地文件更新与…

    2026年9月22日
    200
  • laravel中的契约(Contracts)和门面(Facades)有什么关系_Laravel契约与门面关系解析

    Laravel中的契约定义服务接口,门面提供静态代理,二者协同实现松耦合与易用性:契约通过依赖注入保障可测试性与类型安全,门面通过静态调用简化语法,实际底层对象通常实现对应契约,如Cache门面代理实现IlluminateContractsCacheRepository接口的实例,两者可依场景灵活选…

    2026年9月22日
    100
  • Laravel 8 登录后重定向到仪表盘:完整教程

    本教程详细阐述了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种方法。我们将探讨 Laravel 默认的重定向机制、如何正确配置仪表盘路由及其中间件,并提供通过自定义 LoginController 实现精确重定向的示例代码。通过本文,您将全面掌握 Laravel 认证后的重定向流程,并…

    2026年9月22日
    500
  • 一键PHP环境怎么解决网页空白问题_空白页故障诊断

    答案是开启错误提示并检查文件路径与代码逻辑。先启用PHP错误显示,确认配置正确;再核对网站根目录和入口文件是否存在;接着排查代码致命错误及输出缓冲问题,确保无BOM头且session前无输出。 遇到一键PHP环境安装后出现网页空白或空白页问题,通常不是环境完全失效,而是某些关键环节出了错。这类问题在…

    2026年9月21日
    100
  • MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构MySQL字段注释快速补全方法_Sublime脚本自动生成标准文档结构

    要快速补全mysql字段注释,可通过sublime text编写python脚本实现自动化;1. 脚本获取表名,可手动输入或从当前sql文件解析;2. 通过subprocess调用mysql命令行获取show full columns信息;3. 解析输出内容,提取字段名和现有注释;4. 生成alte…

    2026年9月21日 用户投稿
    200
  • PHP三元运算符HTML输出_PHP三元运算符HTML内容输出

    PHP三元运算符用于在HTML中简洁输出条件内容,基本语法为“条件 ? 值1 : 值2”;2. 常用于动态显示文本、属性或样式,如根据$active输出“启用”或“禁用”;3. 可嵌入HTML标签设置class、disabled等属性,示例中根据登录状态显示不同按钮。 PHP三元运算符用于在HTML…

    2026年9月21日
    200
  • 巧文书AI官网首页官方入口 巧文书AI在线文档编辑官网链接直达

    巧文书AI官网首页官方入口是https://qiaowenshu.cn,该平台提供AI驱动的文档生成、智能解析、语义扩展、在线编辑与保存等功能,支持多场景文案创作和跨设备同步,具备一键润色、风格推荐及模板管理等智能化写作辅助体验。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用…

    2026年9月21日
    100
  • 微信读书网页官方登录入口_微信读书在线阅读官方网站链接

    微信读书在线阅读官方网站链接是https://weread.qq.com/,提供海量图书资源、多设备同步、社交化阅读、听书功能及免费专区与会员体系。 微信读书网页官方登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来微信读书在线阅读官方网站链接,感兴趣的网友一起随小编来瞧瞧吧! ht…

    2026年9月21日
    200
  • PHP中基于参考数组过滤多维数组并保持结构一致性

    本教程详细阐述了如何在PHP中,根据一个参考数组来过滤多维数组的特定子数组,并同步移除其他子数组中对应索引的元素,最终实现数组的结构化筛选和重新索引。文章通过实际案例和代码演示,指导读者高效地处理复杂数组的匹配与清理任务。 在php开发中,我们经常会遇到需要对复杂数据结构进行筛选和整理的场景。例如,…

    2026年9月21日
    100
  • laravel集合有where方法吗

    有。Laravel集合中的where方法是一个非常有用的方法,用于在集合中筛选元素,根据指定的条件返回匹配的元素。使用where方法,可以根据不同的条件来过滤集合中的元素,where方法接受一个闭包作为参数,闭包中可以定义筛选的条件,闭包的每个元素都会传递给闭包。无论是对关联数组还是对对象集合,wh…

    2026年9月21日
    100
  • laravel如何判断请求类型

    laravel判断请求类型的方法:1、使用Request对象的方法,在Laravel中,每个请求都会通过Request对象进行处理。Request对象提供了一些有用的方法来判断请求类型;2、使用路由方法,在Laravel中,路由文件定义了应用程序的请求路由,可以使用路由方法来判断请求类型;3、使用中…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的完整教程

    本教程详细介绍了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种方法。我们将探讨如何利用 Laravel 内置的 $redirectTo 属性,以及如何通过重写 LoginController 中的 login 方法来实现自定义重定向逻辑。此外,教程还将重点讲解正确的路由配置和中间件使用…

    2026年9月21日
    100
  • laravel怎么监控错误

    laravel监控错误的方法:1、错误日志记录,Laravel内置了一个非常强大的日志系统,可以通过查看这些日志文件来了解应用程序中发生的错误;2、异常处理,Laravel提供了一个Exception类,可以用来捕获和处理异常;3、自定义错误页面,创建不同的视图文件,用于处理特定类型错误,当发生相应…

    2026年9月21日
    100
  • PHP一键环境如何配置URL重写_URL Rewrite规则设置

    开启Apache的mod_rewrite模块并配置AllowOverride All,再在.htaccess中添加重写规则,即可实现URL重写,使URL更简洁利于SEO。 在使用PHP一键环境(如XAMPP、WAMP、phpStudy等)时,开启URL重写(URL Rewrite)功能可以让网站的U…

    2026年9月21日
    200
  • 解决WordPress wp-settings.php中致命错误的实用指南

    当WordPress网站遭遇wp-settings.php中Call to undefined function的致命错误时,通常意味着核心文件已损坏。本教程将指导您通过下载全新WordPress副本并替换站点中wp-admin和wp-includes目录来有效解决此问题,确保网站恢复正常运行,并提…

    2026年9月21日
    100
  • 1688阿里巴巴官网网址 1688阿里巴巴批发商城入口

    1688阿里巴巴官网网址是https://www.1688.com,该平台商品种类丰富,涵盖工业品与消费品,支持行业分类查找、厂家直供和热门榜单更新。 1688阿里巴巴官网网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来1688阿里巴巴批发商城入口,感兴趣的网友一起随小编来瞧瞧吧! h…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信