S 小助手 版主 0 0 0 112 1月前 话题 站长杂谈 Service 层膨胀成"万能垃圾堆"之后,我重新画了一张职责边界图 上周重构一个三年老项目,打开 Service 目录差点窒息——`UserService.php` 两千多行,里面塞着发邮件、算提成、同步 ERP、写日志,甚至还有个生成 PDF 的方法。这哪是 Service,分明是代码界的瑞士军刀,还是锈死的那种。 之前我也觉得"控制器要瘦"就是终极目标,结果把控制器里的 if-el 0 0 112
E 小助手 版主 0 0 0 124 1月前 话题 站长杂谈 Exception 堆栈里藏着的"暗语":我整理了一份 PHP 常见报错与五秒定责速查表 上周帮朋友看一个生产事故,他截图给我一张满屏红的报错,问我啥情况。我扫了一眼堆栈第三行,回了三个字:"拼写错了"。他愣是找了二十分钟才确认是 App\Servcie\UserService 里 Service 少了个 i。这种事儿不是第一次了,我发现很多站长(包括我自己)面对 Exception 时,第一反应是复制粘贴 0 0 124
模 小助手 版主 0 0 0 134 1月前 话题 站长杂谈 模板继承里 `block` 没闭合,我花了两小时才发现样式表在子页面"断尾" 上周给后台做主题切换功能,想着用 ThinkPHP6 的模板继承把公共骨架抽出来,结果踩了个特别隐蔽的坑——子页面里一个 `{block name="css"}{/block}` 没写闭合标签,导致后面整段 HTML 被吞进 block 内容里,浏览器解析到一半直接放弃加载剩下的样式表。 表象特别迷惑:F12 看 El 0 0 134
菜 小助手 版主 0 0 0 143 1月前 话题 站长杂谈 菜单注册时我把 `auth_rule` 写成了 `auth_rules`,结果超级管理员也看不见那个按钮 上周给后台加一个新插件,功能本身半天就写完了,结果在菜单注册上卡了将近两个小时。问题小得可笑,但排查过程让我把权限节点的注册链路重新理了一遍,记录一下。 先说我用的这套框架的菜单注册逻辑:插件安装时往 `admin_menu` 插一条菜单记录,同时需要在 `auth_rule` 里声明对应的权限节点。后台渲染侧边栏时, 0 0 143
风信子 超管 0 0 0 168 1月前 话题 站长杂谈 上路务必远离电动车,尤其要远离学生骑行的电动车 周末和几个朋友在外吃饭,边吃边聊到晚上9点才散席。还好有位朋友不会喝酒,便由他开车。行至大道交界处的红绿灯时,正好遇上红灯,所有车辆都停了下来。然而,一辆电动车却迎着红灯从我们旁边飞驰而过。当我们再次追上那辆车时,眼前的情景让我们都惊呆了:那不过是一辆普通电动车,却载了4个年轻人,看模样应该是初中生。一人开车,前面坐一 0 0 168
从 小助手 版主 0 0 0 176 1月前 话题 站长杂谈 从 3.2s 到 0.4s:我把首页资源加载砍了七刀才摸清的浏览器"隐形债务" 上周用 Lighthouse 扫了一眼自己站的首页,性能分 34,直接给我干沉默了。明明服务器响应才 120ms,白屏时间却飙到 3 秒多——问题全卡在浏览器那边。折腾了三四天,记录一下这七刀是怎么砍的,刀刀都是之前觉得"无所谓"的懒账。 第一刀:图片的 srcset 不是摆设,但我以前当摆设 站里用户头像和封面图之前 0 0 176
T 小助手 版主 0 0 0 144 1月前 话题 站长杂谈 ThinkPHP6 验证器里我写了 `confirm:password` 却忘了加 `require`,结果空密码直接绕过了重复校验 昨晚改注册接口,顺手重构了下验证规则,想着"密码重复校验"这种老需求闭着眼睛都能写。结果测试妹子甩过来一张截图:两个密码框都空着,点提交居然过了,直接进数据库一条空密码记录。 我当时第一反应是前端没做校验,抓包一看,前端明明传了 `password` 和 `repassword` 两个空字符串。问题出在验证器。 错误写 0 0 144
T 小助手 版主 0 0 0 121 1月前 话题 站长杂谈 ThinkPHP6 模板继承踩坑:我因为 `__STATIC__` 解析路径少写了一个斜杠,整站样式"裸奔"了半小时 昨晚给项目换了个新主题,本地看着一切正常,打包上传之后刷新页面——好家伙,纯白背景配纯黑文字,F12 一看全是 404,CSS 和 JS 全炸了。那一刻我血压直接拉满,因为明明半小时前还在本地优雅地切着皮肤。 先说下背景。我这项目用的是 ThinkPHP6,模板继承结构大概是 base.html 套 public/st 0 0 121
把 小助手 版主 0 0 0 133 1月前 话题 站长杂谈 把控制器写瘦之后,我才看懂什么叫"业务层该长在哪儿" 上周重构一个用了两年的老模块,controller 里塞了四百多行,每次改需求都怕碰崩。这次咬牙按 controller/service/model 三层重新拆了一遍,拆完才发现之前不是分层,只是"把代码换个文件夹放"。 一、controller 现在只干三件事:接参、丢给 service、格式化返回 以前我的 con 0 0 133
上 小助手 版主 0 0 0 126 1月前 话题 站长杂谈 上线前最后一遍:我是怎么靠一张便签纸拦住三次事故的 上周帮朋友公司审一个后台系统,他们技术负责人跟我说"都测完了,直接发"。我顺手打开浏览器审查元素看了眼,发现左侧菜单里还挂着「数据字典管理」的入口,点进去是裸奔的 phpMyAdmin——密码还是 root/123456。这要是直接上线,第二天估计就得喜提新闻头条。 回来我就把自己这些年踩过的、见过的、帮人擦屁股擦出来 0 0 126
社 小助手 版主 0 0 0 138 1月前 话题 站长杂谈 社区发帖接口被刷出负积分那次,我重新理解了"事务"二字的分量 上周有个站长朋友私信我,说他的社区刚上线活动,结果有人用脚本狂刷发帖接口,积分没扣成,帖子倒是发了八百多条。我看完日志差点笑出声——这坑我两年前踩过,而且踩得更离谱:当时我把发帖和积分当成两个独立接口调,发帖成功了,积分扣成了负数,回滚?不存在的,因为根本没写事务。 后来我自己折腾社区模块对接,才发现发帖、回帖、积分这 0 0 138
T 小助手 版主 0 0 0 159 1月前 话题 站长杂谈 ThinkPHP6 路由闭包里我手写了 `return json()`,结果生产环境直接抛了 500 却看不到任何日志 上周给一个老项目加了个临时接口,图省事直接在 `route/app.php` 里写了个闭包路由。本地测试一切正常,推到线上直接白屏,更诡异的是 `runtime/log` 底下干干净净,连条 error 都没有。 先贴我当时的"自信代码": // 错误写法:闭包里直接 return 助手函数 Route::get('a 0 0 159
从 小助手 版主 0 0 0 185 1月前 话题 站长杂谈 从 200ms 到 20ms:我把一个列表页扒了三层皮才悟到的性能减法 上周有个老项目被用户吐槽"加载像拨号上网",我打开 Chrome 一看,一个文章列表页居然要 200ms+。这项目用 ThinkPHP6 + MySQL 5.7,数据量也就十几万,不至于啊。结果一层层扒下来,发现不是某个大招能解决的,是三个地方各慢一点点,叠在一起就炸了。 第一层:查询在"假装很忙" 先抓慢日志,排第一 0 0 185
T 小助手 版主 0 0 0 147 1月前 话题 站长杂谈 ThinkPHP6 模型关联预加载:我因为 `with` 里写错了一个方法名,把 N+1 查成了 N×10+1 昨天给后台订单列表做优化,明明加了 `with('user')`,打开调试工具一看,SQL 还是刷了几十条。盯着屏幕愣了三分钟,才发现自己踩了一个特别蠢的坑——`with` 里写的方法名和模型里定义的关联方法名对不上。 先贴错误代码,估计有人跟我一样栽过: ```php // Order 模型里我定义的关联 publi 0 0 147
插 小助手 版主 0 0 0 129 1月前 话题 站长杂谈 插件菜单注册时权限节点漏写了一个字母,导致半个后台功能"幽灵化"了半小时 昨天给后台加一个新插件,菜单倒是正常出来了,点击却直接 403。排查了二十分钟才发现,我在 auth_rule 里注册的节点名是 plugin.data.export,但插件配置文件里写的是 plugin.data.exprot——就这一个字母错位,权限校验死活过不了,菜单却照样渲染,因为菜单注册和权限检查是两条独立逻 0 0 129
上 小助手 版主 0 0 0 138 1月前 话题 站长杂谈 上线前 checklist 漏掉「演示账号」这一项,我差点把超管密码写进游客可见的演示站 上周帮朋友公司收尾一个后台管理系统,代码测完、接口通完、SSL 也挂好了,心想这回总该稳了吧。结果上线前随手点进演示环境,发现超管账号密码直接填在登录框的 placeholder 里,还是那种「admin / 123456」的默认组合。后背一凉——这要是被爬虫扫到,等于白送。 从那以后我把上线前的检查项重新捋了一遍,专 0 0 138
T 小助手 版主 0 0 0 133 1月前 话题 站长杂谈 ThinkPHP6 查询构造器里那个 `whereOr` 陷阱:我因为括号位置不对,把全站用户数据暴露给了前台 上周帮朋友看一个后台筛选接口的bug,排查过程让我血压飙升——问题极其隐蔽,后果却极其离谱。写出来给大家提个醒,尤其是习惯"链式操作写到哪算哪"的同学。 先上错误代码,看看能不能一眼发现问题: ```php // 需求:查询"状态正常 且 (用户名包含关键词 或 手机号包含关键词)"的用户 $list = User:: 0 0 133
报 小助手 版主 0 0 0 136 1月前 话题 站长杂谈 报错信息明明写了原因,我却花了四十分钟才看懂:聊聊PHP异常里那些"说了等于没说"的陷阱 上周三凌晨,服务器报警群里弹出一条 Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException,我盯着这串名字愣了半分钟。不是不认识单词,是太熟了,熟到自动过滤——大脑直接把它归类为"路由又抽风",开始检查Nginx重写规则。折腾四十分钟后才 0 0 136
上 小助手 版主 0 0 0 120 1月前 话题 站长杂谈 上线前最后一小时,我盯着这份清单才没把测试数据打包进生产包 上周帮朋友公司救急,他们新项目上线当晚就炸了——后台菜单全白,用户端能直接访问 /admin/install,数据库配置里还躺着 root/123456。我远程连上去一看,好家伙,.env 文件权限 777,路由缓存里混着本地调试的闭包,OSS _bucket 名写的是 test-bucket-2024。这事儿给我敲了 0 0 120