网易首页 > 网易号 > 正文 申请入驻

你的"仓库"根本不是仓库:11个public方法暴露的DAO伪装术

0
分享至

打开任何一个维护多年的Laravel或Symfony项目,搜索"Repository"。随便点开一个结果,大概率会看到类似这样的代码:一个叫getUsersAsArray()的方法,接收array $filters参数,返回塞满stdClass的数组。它躺在App\Repositories\目录下,在容器里注册,代码评审时大家都叫它"用户仓库"。

但它不是仓库。这是个贴着仓库标签的DAO。


这种误标是PHP里最普遍的架构谎言。表面无害——数据进进出出,测试能通过。伤害在后续显现:你想换数据库时,一个用例得引入三个供应商类型才能问业务问题;新人看到findUsersBy(['status' => 'active', 'order_by' => 'created_at DESC', 'limit' => 10]),会问领域逻辑在哪。答案是根本没写。数据库表结构就是领域。

本文用PHP 8.3的术语划清界限:真正的仓库是什么,DAO是什么,以及区分二者的测试标准。

先看那个你每次接手项目都会遇到的文件:

 */public function findAll(array $filters = [], int $limit = 50, int $offset = 0): array$query = DB::table('users');if (isset($filters['status'])) {$query->where('status', $filters['status']);if (isset($filters['email_like'])) {$query->where('email', 'like', '%' . $filters['email_like'] . '%');return $query->orderBy('created_at', 'desc')->limit($limit)->offset($offset)->get()->all();public function findById(int $id): ?\stdClassreturn DB::table('users')->where('id', $id)->first();public function insert(array $row): intreturn (int) DB::table('users')->insertGetId($row);public function updateById(int $id, array $changes): intreturn DB::table('users')->where('id', $id)->update($changes);public function deleteById(int $id): intreturn DB::table('users')->where('id', $id)->delete();}

看这些签名。返回类型是array。参数是array $filters加两个分页整数。方法名是findAllinsertupdateByIddeleteById——全是数据库方言,不是业务语言。

这是DAO(Data Access Object)的经典形态:直接映射表结构,暴露原始查询能力,用数组传递条件。5个公开方法,每个都在说"我怎么操作数据库",而不是"业务需要什么"。

真正的仓库长什么样?

3个方法。参数是值对象(UserId、DateRange、User),返回的是领域实体或集合。没有array $filters,没有分页偏移量,没有数据库专属的stdClass

关键区别:仓库的接口由用例驱动,DAO的接口由表结构驱动。

测试标准很简单。问两个问题:

第一,能否在不运行数据库的情况下,用内存实现替换这个类?DAO通常做不到——它的方法签名里嵌着SQL语义(email_likeorder_by)。仓库可以,因为DateRangeUserCollection与存储无关。

第二,换个数据库供应商,接口需要改吗?DAO的findAll方法在MongoDB里要重写,因为过滤数组的语法完全不同。仓库的activeWithin不需要动——它描述的是业务规则,不是查询语法。

那个11个公开方法的类(实际示例中5个,但生产代码往往膨胀到7-15个)之所以危险,是因为它让团队误以为自己在做领域驱动设计。他们在代码评审时说"这是仓库模式",在文档里写"数据访问层已抽象",但架构图上的依赖箭头全部指向Illuminate\Database。

重构路径很清晰:把array $filters换成具体的查询对象,把stdClass换成实体,把分页逻辑移到应用层或专门的查询服务。但第一步是停止叫它仓库。命名即契约,错误的命名让错误的依赖变得不可见。

下次搜索"Repository"时,数一下返回类型里有多少个arraystdClass。那就是你的技术债仪表盘。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
张一鸣造车成功,震惊行业

张一鸣造车成功,震惊行业

李东阳朋友圈
2026-06-04 14:06:40
0-1!荷兰爆冷遭世界第28绝杀 4500万锋霸失空门 齐祖儿子6次神扑

0-1!荷兰爆冷遭世界第28绝杀 4500万锋霸失空门 齐祖儿子6次神扑

我爱英超
2026-06-04 06:43:12
被判无期的犯人,每天在监狱里如何生活?真实日常远比想象难熬

被判无期的犯人,每天在监狱里如何生活?真实日常远比想象难熬

芳姐侃社会
2026-05-31 20:40:00
问界,模仿其广告语追问起火事件!

问界,模仿其广告语追问起火事件!

稿得轻松
2026-06-04 07:33:41
她是文强的妻子,被判刑8年,将弟弟也害了,出狱后她现状如何?

她是文强的妻子,被判刑8年,将弟弟也害了,出狱后她现状如何?

细品名人
2026-06-02 07:08:23
白嫖潮汕火锅失控!多位被坑商家再实锤,警方出手,坐牢只是开始

白嫖潮汕火锅失控!多位被坑商家再实锤,警方出手,坐牢只是开始

奇思妙想草叶君
2026-06-03 17:07:22
穆里尼奥疯了!皇马首签不要金球奖罗德里,要 8000 万降级队中场

穆里尼奥疯了!皇马首签不要金球奖罗德里,要 8000 万降级队中场

奶盖熊本熊
2026-06-04 04:52:22
中俄通婚剧增,若不了解俄罗斯女性生理特征,婚后可能会很痛苦

中俄通婚剧增,若不了解俄罗斯女性生理特征,婚后可能会很痛苦

抽象派大师
2026-06-03 22:04:48
9年投入5800万!董路没教练证却带足球小将夺冠 孙继海:马戏团

9年投入5800万!董路没教练证却带足球小将夺冠 孙继海:马戏团

念洲
2026-06-03 06:51:28
既然菲方不稀罕中国援助,中方可以成全他们,毛宁打开天窗说亮话

既然菲方不稀罕中国援助,中方可以成全他们,毛宁打开天窗说亮话

冷眼看尽世间繁华
2026-06-04 12:13:51
张学友的嘴,是开了光的预言家…

张学友的嘴,是开了光的预言家…

慧翔百科
2026-06-03 08:46:01
伊朗放宽谈判口径,俄罗斯央行崩溃示警

伊朗放宽谈判口径,俄罗斯央行崩溃示警

西楼饮月
2026-06-03 18:34:18
太惨了!商场80%店关门,武汉一商场从开业爆火到8成空置,引热议

太惨了!商场80%店关门,武汉一商场从开业爆火到8成空置,引热议

火山詩话
2026-06-03 11:47:35
善恶终有报!不顾央视警告,与刘涛传出绯闻的杨烁,终将自食恶果

善恶终有报!不顾央视警告,与刘涛传出绯闻的杨烁,终将自食恶果

圆梦的小老头
2026-06-01 04:51:39
国际大都市,尼克斯G1取胜后,G3最低票价已飙升至6207美元

国际大都市,尼克斯G1取胜后,G3最低票价已飙升至6207美元

懂球帝
2026-06-04 12:52:28
不黑不吹,小米汽车2026年55万的销量任务,只怕完不成了

不黑不吹,小米汽车2026年55万的销量任务,只怕完不成了

互联网.乱侃秀
2026-06-04 10:00:08
通辽发布:世界杯揭幕战6名护旗手全部定向从内蒙古选拔

通辽发布:世界杯揭幕战6名护旗手全部定向从内蒙古选拔

懂球帝
2026-06-04 10:13:41
4天期限已到,中方不忍了!我大使敲警钟,欺负中国人后果很严重

4天期限已到,中方不忍了!我大使敲警钟,欺负中国人后果很严重

冷眼看尽世间繁华
2026-06-03 20:01:43
金价跌破980元/克!北京菜百店员称购买投资金条者减少约六成,专家提醒勿将投资变投机

金价跌破980元/克!北京菜百店员称购买投资金条者减少约六成,专家提醒勿将投资变投机

极目新闻
2026-06-04 00:07:31
1分钟搞懂各种咖啡,点单不踩雷

1分钟搞懂各种咖啡,点单不踩雷

混知
2026-05-26 16:20:33
2026-06-04 14:36:49
野生运营
野生运营
懂点产品,懂点AI,正在努力给平淡日子搞点新花样。
4544文章数 45关注度
往期回顾 全部

科技要闻

历史最大IPO!马斯克下周冲击万亿富豪

头条要闻

江苏一单亲妈妈和小12岁男子姐弟恋 怀孕后男友玩失联

头条要闻

江苏一单亲妈妈和小12岁男子姐弟恋 怀孕后男友玩失联

体育要闻

王俊杰11前板成第一尖刀 媒体人:独一档

娱乐要闻

奚梦瑶头纱上的古董发卡也是四太的

财经要闻

SpaceX发行价135美元 6月12日上市交易

汽车要闻

北京现代5月销量强势反弹:国内17065辆 出口环比翻倍

态度原创

家居
房产
健康
艺术
数码

家居要闻

220平对味儿家 空间情绪宅

房产要闻

震撼!海口顶豪“素颜出境”,直接顶穿品质天花板!

违规干细胞抗衰美容,为何肆无忌惮

艺术要闻

唐寅『梅花册』

数码要闻

NAND厂商一季赚超一年!企业级SSD疯狂吞噬产能:消费级涨价无解

无障碍浏览 进入关怀版