您的位置:首页 > 编程语言 > PHP开发

Laravel记录一之修改器和访问器

2017-12-16 00:00 302 查看
摘要: 最近在使用lumen写接口时,需要使用到修改器和访问器来处理项目的附件(图片、问答、视频等等)。所以对Laravel的修改器和访问器做一个剖析。

最近在给前端写API的时候,需要处理前端传过来的附件。由于架构的原因,不能使用本地存储,或者文件存储之类的,更不能使用类似于“fopen”这样的函数来处理(当然,我不是看不起他们)。项目目前是前后端完全分离的,前端采用的是Vue,而后端接口采用的是Laravel的阉割版—lumen框架。

于是这里附件的存储和传输就采用了阿里云OSS(当然了,这也没有什么技术含量,看看文档什么的就能搞定的)。在前端选择图片之后调取集成了阿里OSS的接口,直接上传并进行云存储。在前端存储之后,回返回一个对象数组,这个对象数字里就含有大量的附件保存的信息,包括数据库存储和阿里OSS的存储信息。于是在我们重新得到这个信息包的时候就很麻烦了,因为没有相应的字段来存储,所以这个时候就需要用到修改器和访问器了(参考laravel文档)。

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
*/

3ff0
public function getIsGetAttachmentAttribute($value)
{
return isset($this->attributes['is_get_attachment']) ?
$this->attributes['is_get_attachment'] : false;
}

于是,当我们需要得到 keyword_attachment 的属性的时候,我们就需要给属性 is_get_attachment 赋值为true。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: