如何重写Laravel模型属性?替换对象内https://为[[http:]]
解决Laravel模型中替换external_urls里的HTTPS前缀问题
嘿,我来给你支招!在Laravel里处理这种属性值的修改,用**访问器(Accessor)**是最地道的做法,完全符合框架的设计规范。
你已经把external_urls通过$casts转成了object类型,那我们只需要在Training模型里定义一个访问器方法,就能在每次获取这个属性的时候自动完成替换操作。
具体实现代码
直接在你的Training模型里添加下面这个方法:
public function getExternalUrlsAttribute($value) { // 先把object转成数组,方便遍历修改 $urls = json_decode(json_encode($value), true); // 遍历每个链接项,替换url里的https://前缀 foreach ($urls as &$item) { if (isset($item['url']) && is_string($item['url'])) { $item['url'] = str_replace('https://', '[[http:]]//', $item['url']); } } // 再转成object类型保持和原来的类型一致 return (object)$urls; }
额外的健壮性优化
如果你的external_urls可能为空或者格式不太规范,可以加个空值判断,避免报错:
public function getExternalUrlsAttribute($value) { // 空值直接返回,避免后续操作出错 if (empty($value)) { return $value; } $urls = json_decode(json_encode($value), true); foreach ($urls as &$item) { if (isset($item['url']) && is_string($item['url'])) { $item['url'] = str_replace('https://', '[[http:]]//', $item['url']); } } return (object)$urls; }
效果说明
这样不管你是直接调用$training->external_urls,还是把模型转成JSON返回给前端,拿到的external_urls都会是你想要的结构:
"external_urls": [ { "url": "[[http:]]//google.com/", "name": "test link" } ]
内容的提问来源于stack exchange,提问作者Mostafa Abdellaoui
相关产品推荐
相关产品推荐

