开发者社区> 勃起狂奔者> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

TP5获取器

简介: 前言: tp5中有个小功能,在文档中介绍的不多,却非常实用,在其他地方它叫读取器。tp5中它叫获取器。如果单看文档我也觉得有些云里雾里,好像懂了又好像没懂。
+关注继续查看

前言:

tp5中有个小功能,在文档中介绍的不多,却非常实用,在其他地方它叫读取器。tp5中它叫获取器。如果单看文档我也觉得有些云里雾里,好像懂了又好像没懂。下面我们结合实际应用场景来看看这个获取器的应用。

应用一:

当我们在数据库中保存一张图片的路径时。我们一般会选择保存相对路径,因为相对路径更加灵活。如果在后端渲染视图时,直接使用相对路径也没有问题。可是当我们应用到接口开发中,我们返回客户单需要返回完整的带域名的路径。这个时候,我们不能在每次返回的时候,都去添加上域名。这样就非常的麻烦。下面来看看获取器如何解决这个问题。

首先我交代下数据表结构:除了表中保存图片的字段url,还有一个字段from,这个from就代表是否存在自己的服务器上,如果是1,则存储的是相对路径,而from等于别的数字,则代表存储在别的服务器上,存储的是绝对路径
然后我们将需求分解
第一我们将图片url返回到客户端时//TODO
第二是将url加上域名
我们认为,给url加上域名这个操作是比较容易复现的。
所以我们讲这个操作封装到基类之中

class BaseModel extends Model
{

    /**
     * 拼接web域名,根据传入$data中的from判断储存状况.自动返回url
     * @param $value 存储的url
     * @param $data  当前url所属的整条数据
     * @return string
     */
    protected function splicingPrefix($value, $data)
    {
        //如果from的值等于1则说明是存在自己的服务器里的,也就是存的相对路径
        //如果不为1,则是存在cnd或别的服务器上,就是存的绝对路径,就不做任何修改
        return $data['from'] == 1 ? (config('setting.url_prefix') . $value) : $value;
    }

}

中间使用了config助手函数,我将自己的域名放在配置中,方便以后换域名等。

那么现在问题是,这个拼接方法很简单,可是,$value,$data这两个参数是哪里来的。

这时候就该看看我们获取器的用法了。

  1. 首先获取器是写在Model层的,而且要继承自tp的model类
  2. 获取器方法名是一个固定的写法 (get驼峰写法的字段名Attr)比如 getUrlAttr
  3. 获取器会自动接收两个参数,一是读取字段的值,二传入的是当前的所有数据数组
class Image extends BaseModel
{
    protected $visible = ['url'];

    /**
     * 读取器,在读取的时候触发,调用基类中的拼接web域名方法
     * @param $value
     * @param $data
     * @return string
     */
    public function getUrlAttr($value, $data)
    {
        return $this->splicingPrefix($value,$data);
    }
}

这样我们tp注入的两个参数拿去调用模型基类中的拼接域名方法。
那么当读取到url这个参数时,首先会触发获取器,获取器会接受$value,$data两个参数,拿到这两个参数后,会到模型基类中去调用拼接域名方法,然后返回,返回到获取器方法之后,获取器又将结果返回。
这样我们在读取url时,读取的就是一个已经被处理过的完整的url了

应用二:

有时候,我们会将数据库中某一个字段来存储一些序列化后的数组。虽然这样做并不太好。但是确实有需求,我们在查数据反回给客户端时,需要反序列化下。如果每次查这条数据的时候都去手动反序列化,就不太方便。

我们看看获取器是如何帮助我们搞定的

我这里就拿地址地址来做比方,我讲地址数据保存在数组中,序列化后存在数据库
在对应的model层中,构建获取器。

    public function getSnapAddressAttr($value)
    {
        if (empty($value)) {
            return null;
        }
        return unserialize($value);
    }

这样,在读取地址字段时候,就会自动的反序列化成一个数组。

好啦今天就介绍到这里,比较简单的用法,主要是开阔下思路。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
轻松教你使用纯css实现H5-Doorin编辑器中的水波动画
css3给我们前端开发带来了很便利, 我们可以使用css3 的新特性实现各种形状和动效, 接下来笔者就来带大家介绍如何用css3实现 H5-Dooring编辑器 中的水波动画.
107 0
TP5巧用验证器
tp5 前言: 我们在做API开发的时候,我们会接受客户端传来的参数,大家都知道这个参数是不可信的,我们后端开发人员必须对这个参数进行验证。我在之前的开发中只是知道tp5的验证器,并不知道他的用途,因为之前的开发验证,往往都是基于模型字段进行的验证。
1414 0
Atom 编辑器系列视频课程
此课程为 Atom 编辑器系列课程,主要介绍了 Atom 的高效开发技巧以及必备插件。 课程列表 Atom编辑器系列课程 #1 - Atom简介 Atom编辑器系列课程 #2 - 设置简介 Atom编辑器系列课程 #3 - 快速格式化代码插件 atom-beautify [#4 - 即将更新]...
825 0
公众平台关注用户达到5万即可开通流量主功能 可以推广APP应用
  今天微信公众平台发布发布了一些更新,公众帐号的关注用户达到5万,即可开通流量主功能,之前的是要求10万粉丝,这是一个微信开放的信号。广告主可推广苹果商店应用或腾讯开放平台应用。新增卡片和图文广告规格。
916 0
在在Oracle VirtralBox 安装 Oracle 10g For Oracle Linux 5
正式Oracle Linux5.3上安装数据库 1、检查操作系统版本 [root@ora10g ~]# uname -a Linux ora10g.
970 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载