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);
    }

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

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

相关文章
|
安全 机器人 API
『GitHub项目圈选08』推荐5款本周使用率超高的开源项目
『GitHub项目圈选08』推荐5款本周使用率超高的开源项目
631 1
|
存储 NoSQL Linux
Redis三种集群模式原理与搭建配置
Redis三种集群模式原理与搭建配置
3151 0
|
12月前
|
机器学习/深度学习 人工智能 PyTorch
阿里云GPU云服务器简介:优势场景价详解,最新收费标准与活动价格参考
阿里云GPU云服务器怎么样?阿里云GPU结合了GPU计算力与CPU计算力,主要应用于于深度学习、科学计算、图形可视化、视频处理多种应用场景,现在购买有包月5折包年4折起等优惠,GPU 计算型 gn6i实例4核15G包月优惠价1681.00元/1个月起,包年16141.80元/1年起;GPU 计算型 gn6v实例8核32G包月优惠价3817.00元/1个月起,包年36647.40元/1起等。本文为您详细介绍阿里云GPU云服务器产品优势、应用场景以及最新活动价格。
|
9月前
阿里云服务器带宽收费价格解析:1M、3M、5M、10M带宽价格参考
阿里云服务器1M、3M、5M、10M宽带需要多少钱?单说阿里云服务器宽带多少钱,而不确定云服务器实例规格及cpu和内存配置的话,是没办法具体说多少钱的,因为云服务器的价格受很多因素影响。本文将详细解析阿里云服务器在1M、3M、5M、10M不同带宽下的价格差异,以供您参考和选择。
3111 3
|
人工智能 安全 Apache
Unity Catalog 三大升级:Data+AI 时代的统一治理再进化
在刚刚落幕的 2025 Databricks Data + AI Summit 上,Databricks 重磅发布了多项 Lakehouse 相关功能更新。其中,面向数据湖治理场景的统一数据访问与管理方案 —— Unity Catalog,迎来了三大关键升级:全面支持 Apache Iceberg、面向业务用户的全新使用体验,以及数据治理与安全能力的持续增强。
|
人工智能 前端开发 架构师
2025年前端局势分析,我该不该转行?
2024年,前端领域经历了快速变化,AIGC的兴起和市场HC减少使得前端工程师面临挑战。尽管AI工具如通义灵码和Cursor能高效生成代码,但AI无法完全取代前端工程师,因其缺乏逻辑、沟通和创新能力。前端工作不仅限于编码,还包括需求分析、代码评审等。未来,前端不会“死亡”,而是持续演变。面对大环境的压力,提升综合能力、拥抱变化、持续学习和保持身心健康是关键。转型方向包括升管理、做架构师或转讲师等。稳住2025年,需适应变化、不断学习并探索更多可能性。
2990 16
|
JavaScript 前端开发
layui下拉框xm-select自定义搜索使用方法
【10月更文挑战第28天】`xm - select` 是基于 Layui 的下拉框增强插件,支持自定义搜索功能。实现步骤包括:1. 引入 Layui 和 xm - select 的核心文件;2. 创建下拉框的基本 HTML 结构;3. 使用 `layui.use` 函数初始化插件并配置搜索功能;4. 可选地进行高级自定义搜索优化,如模糊匹配、多字段搜索和实时更新数据。通过这些步骤,可实现灵活的下拉框搜索功能。
4517 1
|
传感器 网络协议 网络架构
计算机网络基础教程:拓扑
【4月更文挑战第5天】
2407 9
 计算机网络基础教程:拓扑
|
SQL 关系型数据库 数据处理
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
3958 0
|
关系型数据库 MySQL 数据库
MySQL8.0.36 安装配置教程(保姆级,包含图文讲解,环境变量的配置)适合小白
MySQL8.0.36 安装配置教程(保姆级,包含图文讲解,环境变量的配置)适合小白

热门文章

最新文章