Laravel记录一之修改器和访问器 - 一片枫叶ing的个人空间 - 开源中国

[Laravel记录一之修改器和访问器 - 一片枫叶ing的个人空间 - 开源中国]

        最近在给前端写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
     */
    public function getIsGetAttachmentAttribute($value)
    {
        return isset($this->attributes['is_get_attachment']) ? 
               $this->attributes['is_get_attachment'] : false;
    }

        于是,当我们需要得到 keyword_attachment 的属性的时候,我们就需要给属性 is_get_attachment 赋值为true。


Original url: Access

Created at: 2018-10-10 17:18:31

Category: default

Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论