模型修改器不能直接补全富文本图片域名,因其仅处理字段值、不解析html、无请求上下文;应改用控制器服务、模板函数或模型内非修改器方法,并校验url、转义路径、动态获取协议+域名。

模型修改器不能直接处理富文本中的图片路径补全——它只对单个字段值生效,而富文本是 HTML 字符串,里面可能含多个 <img> 标签。想靠 setContentAttr() 自动补全域名,会漏掉解析、重复替换、正则逃逸等一堆坑。
为什么 setXxxAttr 修改器不适合补全富文本图片域名
修改器本质是字段级转换函数,输入是控制器传进来的原始值(比如 $_POST['content']),输出是存进数据库的最终值。但它不解析 HTML 结构,也不感知请求上下文(如当前域名)。常见误用:
- 直接在
setContentAttr()里写preg_replace()—— 一旦内容含双引号、转义字符或嵌套标签,正则就崩; - 调用
$this->request->domain()—— TP6 模型实例在非请求生命周期(如命令行、队列任务)中可能拿不到Request对象; - 补完后又在模板里用
htmlspecialchars()输出,导致<img>被转义,图片不显示。
真正该用的地方:模型外的专用处理方法
补全域名这事,得交给「能安全解析 HTML」且「明确知道当前请求域」的环节。推荐两种实操路径:
- 在控制器里调用专用服务方法,比如:
$data['content'] = $this->htmlToImages($data['content']);,再传给模型; - 在视图层(如模板文件)用
{:html_to_images($article.content)},前提是该函数已注册为模板函数且内部调用request()->domain(); - 若必须塞进模型逻辑,定义一个非修改器的公共方法:
public function fixImageDomain($html),在save()前手动调用,不依赖Attr后缀规则。
补全逻辑里最容易翻车的三个点
不管在哪层实现,以下三点不检查,100% 出问题:
-
filter_var($src, FILTER_VALIDATE_URL)必须用 —— 否则相对路径(如/uploads/a.jpg)和协议相对路径(如//cdn.com/b.png)都会被错误拼接; - 正则替换要用
preg_quote($old, '/')转义原始路径,否则路径含.、?时整个替换失效; - 别硬编码
https://—— 应该用$this->request->scheme() . '://' . $this->request->host()或封装好的serverUrl(),否则 HTTP 站点生成 HTTPS 链接,图片被浏览器拦截。
补域名看着简单,但富文本是 HTML 字符串,不是普通字段。模型修改器的边界很清晰:它管「字段值怎么存」,不管「HTML 里某个属性怎么修」。真要自动化,得让解析和上下文能力匹配任务本身。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











