最近在给前端写API的时候,需要处理前端传过来的附件。由于架构的原因,不能使用本地存储,或者文件存储之类的,更不能使用类似于“fopen”这样的函数来处理(当然,我不是看不起他们)。项目目前是前后端完全分离的,前端采用的是Vue,而后端接口采用的是Laravel的阉割版—lumen框架。
于是这里附件的存储和传输就采用了阿里云OSS(当然了,这也没有什么技术含量,看看文档什么的就能搞定的)。在前端选择图片之后调取集成了阿里OSS的接口,直接上传并进行云存储。在前端存储之后,回返回一个对象数组,这个对象数字里就含有大量的附件保存的信息,包括数据库存储和阿里OSS的存储信息。于是在我们重新得到这个信息包的时候就很麻烦了,因为没有相应的字段来存储,所以这个时候就需要用到修改器和访问器了(参考)。
1. 首先我们在Models当中添加要增加的字段
/** * @var array */ protected $appends = [ 'keyword_attachment',//附件 ];
2. 然后为 keyword_attachment 属性定义一个访问器 getKeywordAttachmentAttribute(),当 Eloquent 尝试获取 keyword_attachment 的值时,将会自动调用此访问器,返回所需要的附件:
/** * 获取附件 * @return array */ public function getKeywordAttachmentAttribute(){ $result = Attachment::where('belong', $id) ->where('location', 'keyword') ->get(); return $result; }
3.于是接下来,我们就可以在相应的模型中访问 keyword_attachment 属性,直接获取到 keyword_attachment 的值。
但是我们不想获取到这个keyword_attachment 属性值那又怎么呢?
4.这儿我们可以通过设置虚拟字段来判断是否加载 keyword_attachment 属性
/** * @var array */ protected $appends = [ 'keyword_attachment',//附件 'is_get_attachment',//通过设置此虚拟字段来判断是否加载附件 ];
5.相应的还是给它定义一个访问器,但是为保证和判断此虚拟字段是否加载此属性,因此,我们需要先定义一个修改器 setIsGetAttachmentAttribute() 来设置相应的虚拟字段:
/** * 通过设置此虚拟字段来判断是否加载 附件 * @param $value * @return mixed */ public function setIsGetAttachmentAttribute($value = false) { return $this->attributes['is_get_attachment'] = $value; }
然后定义访问器 getIsGetAttachmentAttribute() :
/** * 通过设置此虚拟字段来判断是否加载 附件 * @return mixed */ public function getIsGetAttachmentAttribute($value) { return isset($this->attributes['is_get_attachment']) ? $this->attributes['is_get_attachment'] : false; }
于是,当我们需要得到 keyword_attachment 的属性的时候,我们就需要给属性 is_get_attachment 赋值为true。