Laravel 5.5自定义模型属性问题:添加非数据库常量属性
问题:Laravel User模型添加非数据库常量属性未被返回
我正在通过以下代码获取用户信息:
/** * User info * Retrieve the user info based on the Access Token * * @param Request $request */ public function user(Request $request) { return $this->successResponse(request()->user(), 200); }
我希望在User模型中添加一个不存在于数据库中的常量属性,但尝试在User模型中添加公共变量gravatar后,该属性未被返回。请问该如何实现?
User模型代码片段如下:
class User extends Authenticatable { use Notifiable, HasApiTokens; // 补全省略的Trait // ... 其他代码 public $gravatar = '默认头像地址'; // 添加的公共属性,但未被返回 }
解决方案
这是因为Laravel的Eloquent模型默认只会序列化数据库中存在的字段,直接添加的公共属性不会自动被包含在返回结果里。这里有两种简单有效的实现方式:
方法一:使用访问器(推荐)
访问器是Laravel模型的原生特性,能动态生成虚拟属性,而且会自动被包含在序列化结果中,非常适合这种场景。
在你的User模型里添加下面的方法:
class User extends Authenticatable { use Notifiable, HasApiTokens; // ... 其他代码 /** * 获取用户的Gravatar属性 * * @return string */ public function getGravatarAttribute() { // 返回固定常量值,比如默认头像地址 return 'https://example.com/default-avatar.png'; // 如果需要基于用户邮箱动态生成Gravatar,也可以这么写: // return 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($this->email))); } }
这样当你返回request()->user()时,gravatar属性就会自动出现在响应结果里,不需要额外配置。
方法二:将公共属性加入$appends数组
如果你坚持用公共变量的方式,只需要把属性名添加到模型的$appends数组中,告诉Laravel序列化时要包含这个属性:
class User extends Authenticatable { use Notifiable, HasApiTokens; // 定义要追加的属性列表 protected $appends = ['gravatar']; // 你的公共属性 public $gravatar = 'https://example.com/default-avatar.png'; // ... 其他代码 }
这样Laravel在把模型转换成数组或JSON时,就会把gravatar属性包含进去了。
补充:常量属性的规范写法
如果你的属性是真正不会改变的常量,还可以先定义类常量,再通过访问器返回,这样更符合代码规范,也方便统一维护:
class User extends Authenticatable { use Notifiable, HasApiTokens; const DEFAULT_GRAVATAR = 'https://example.com/default-avatar.png'; public function getGravatarAttribute() { return self::DEFAULT_GRAVATAR; } }
内容的提问来源于stack exchange,提问作者Stefano Maglione
相关产品推荐
相关产品推荐

