ThinkPHP:模型三大利器之二(修改器)

ThinkPHP:模型三大利器之二(修改器)

修改器是模型的三大利「器」之一,本篇我们来总结下修改器的用法,以及一些注意事项。

定义修改器

修改器的作用是在模型对象数据写入数据库之前进行一些必要的数据处理,修改器的标准定义如下:

public function setFieldNameAttr($value, $data){    // 对value值进行处理 data参数是当前全部数据    // 返回值就是实际要写入数据库的值    return $value;}

其中FieldName对应数据表的field_name字段(注意数据表字段的规范和修改器方法定义规范,否则会导致错误)。

立即学习“PHP免费学习笔记(深入)”;

原则上,每个修改器应当仅处理对应字段的数据,但在必要的情况下允许同时处理多个字段。

下面是一个例子

public function setBirthdayAttr($value, $data){    // 格式化生日数据    $birthday = strtotime($value);    // 根据生日判断年龄    $age = getAgeByBirthday($birthday);    // 赋值年龄数据    $this->setAttr('age', $age);    return $birthday;}public function setAgeAttr($value,$data){    return floor($value);}

之所以使用setAttr方法是确保年龄赋值操作仍然可以走单独的修改器。如果你没有额外的修改器,那么也可以写成

public function setBirthdayAttr($value, $data){    // 格式化生日数据    $birthday = strtotime($value);    // 根据生日判断年龄    $age = getAgeByBirthday($birthday);    // 赋值年龄数据    $this->data['age'] = $age;    return $birthday;}

注意一定不能写成

$this->age = $age;

因为在模型内部进行数据对象的赋值,会因为和模型内部属性混淆而导致不可预知的后果。

如果你在某个修改器中可能会对其它字段进行修改,务必记得你需要额外修改的字段修改器必须已经经过赋值操作(或者已经触发过修改器)。

如何调用

修改器方法不需要手动调用,按照定义规范定义好后,系统会在下面的情况下自动调用:

    ·模型对象赋值;

    ·调用模型的data方法,并且第二个参数传入true;

    ·调用模型的save方法,并且传入数组数据;

    ·显式调用模型的setAttr方法;

    ·定义了该字段的自动完成;

例如User模型定义了setPasswordAttr修改器方法。

public function setPasswordAttr($value, $data){    return md5($value);}

当下面这样使用的时候,保存到数据库的password字段的值就会变成md5(‘think’)后的值。

可图大模型 可图大模型

可图大模型(Kolors)是快手大模型团队自研打造的文生图AI大模型

可图大模型 32 查看详情 可图大模型

$user = User::get(1);$user->password = 'think';$user->save();

如果你在一些情况下,不希望使用修改器而是想要手动控制数据,可以尝试使用下面的方法。

$user = User::get(1);$user->data('password', md5('think'));$user->save();

这个时候就不会经过修改器处理。

避免冲突

很多开发者喜欢给修改器定义自动完成auto(包括insert和update)。

protected $auto = ['password'];

这在V5.1.27版本之前是一个看似聪明却非常致命的错误,要尽量避免,因为根据我们之前给出的修改器触发条件,会导致该修改器被执行两次。这会是一个灾难性的错误,将导致所有的用户注册后都无法正常登录。

解决办法取消password字段的自动完成设置,因为修改器会在每次赋值的时候自动触发,如果没有赋值说明密码没有被修改,也谈不上自动完成。

自动完成的字段通常是不在表单里面的字段,一般是由系统自动处理的字段。

V5.1.27版本改进了这个问题,所有的修改器只允许执行一次,上面的问题就不复存在了。但好像又带来了一个新的问题,很多时候,你也许想在模型的事件中对数据进行修改。

User::beforeUpdate(function($user) {    $user->password = md5('think');});

会发现,在模型beforeUpdate事件中,数据的值怎么都修改不了,原因是模型的修改器之前在第一次赋值的时候已经执行了,第二次再赋值的时候已经无效了(不会再执行)。

解决办法就是我前面提过的使用data方法不调用修改器进行数据赋值操作。

User::beforeUpdate(function($user) {    $user->data('password', md5('think'));});

当然,更好的建议是规划好修改器、自动完成和模型事件的数据处理机制,不要对一个字段同时使用多重机制修改数据,并且写入数据库的数据应该并且只有修改器这一个途径进行数据修改操作。

类型自动转化

如果你的修改器仅仅是对数据做类型转换处理的话,可以无需定义修改器,而是直接定义字段类型就可以了。

public function setScoreAttr($value, $data){    return (float) $score;}

上面的修改器方法可以直接改成

protected $type = [    'score'    =>    'float',];

如果你同时对一个字段定义了修改器和类型的话,修改器是优先的。

类型定义不仅能定义简单的数据类型,还有一些额外的用途,例如:json 类型、array类型和object 类型会进行JSON序列化,serialize类型则会把数据进行serialize序列化。

PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!

本文转自:https://blog.thinkphp.cn/817548

以上就是ThinkPHP:模型三大利器之二(修改器)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/235756.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
es文件浏览器如何连接到NAS设备 es文件浏览器通过SMB/FTP协议连接NAS教程
上一篇 2025年11月3日 23:16:42
composer包的版本号怎么遵循SemVer规范_解析composer版本号的SemVer规范
下一篇 2025年11月3日 23:16:46

相关推荐

  • yii和thinkphp的优缺点有哪些

    yii和thinkphp的优缺点有哪些yii和thinkphp的优缺点有哪些yii和thinkphp的优缺点有哪些yii和thinkphp的优缺点有哪些

    一、ThinkPHP ThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。 Think…

    2026年9月26日 • 用户投稿
    000
  • thinkphp和yii2的优缺点是什么?

    thinkphp和yii2的优缺点是什么?thinkphp和yii2的优缺点是什么?thinkphp和yii2的优缺点是什么?thinkphp和yii2的优缺点是什么?

    什么是thinkphp?优缺点是什么? ThinkPHP是免费开源的,快速的,简单的,面向对象的轻量级PHP开发框架,ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,Thi…

    2026年9月25日 • 用户投稿
    200
  • thinkphp函数有哪些

    thinkphp函数有哪些thinkphp函数有哪些thinkphp函数有哪些thinkphp函数有哪些

    thinkphp函数有哪些? thinkphp5.0 助手函数大全 推荐教程:thinkphp教程 load_trait:快速导入Traits,PHP5.5以上无需调用 /** * 快速导入Traits PHP5.5以上无需调用 * @param string $class trait库 * @pa…

    2026年9月25日 • 用户投稿
    200
  • 如何在ThinkPHP6中使用Eloquent简化业务层

    随着互联网的发展,web应用程序的开发已经成为现代软件开发的核心。由于业务逻辑的复杂性,开发人员需要很多工具和技术来简化代码,提高效率。在这方面,使用eloquent orm可以大大简化业务层代码。在本文中,我们将介绍如何在thinkphp6中使用eloquent来简化业务层。 什么是Eloquen…

    用户投稿 2026年9月25日
    100
  • thinkphp和yii区别

    thinkphp和yii区别thinkphp和yii区别thinkphp和yii区别thinkphp和yii区别

    thinkPHP:社区火爆,中文的新手教程很详细,比较容易上手。   (推荐学习:thinkphp5) web项目开发中大部分代码都是重复的,因此自动化代码生成工具是必不可少的,截至最新的tp3.2.3,我仍然没看到tp对自动化工具有任何支持的迹象;gii非常好用的建模块、控制器(动作)、CURD操…

    2026年9月25日 • 用户投稿
    000
  • thinkphp缓存和redis缓存哪个快

    thinkphp缓存和redis缓存哪个快thinkphp缓存和redis缓存哪个快thinkphp缓存和redis缓存哪个快thinkphp缓存和redis缓存哪个快

    tp5中的cache 储存方式,我本地设置的是读取文本的形式。 以这段代码为例:    (推荐学习:thinkphp5) public function getAllManegerId(){ $cache =checkCache(‘kf_getallManeger’); if($cache)retu…

    2026年9月25日 • 用户投稿
    100
  • ThinkPHP6.0管道模式与中间件的实现分析

    说明 ThinkPHP 6.0 RC5 开始使用了管道模式来实现中间件,比起之前版本的实现更加简洁、有序。这篇文章对其实现细节进行分析。 首先我们从入口文件 public/index.php 开始,$http = (new App())->http; 获得一个 http 类的实例后调用它的 r…

    2026年9月25日
    000
  • thinkphp开发用什么IDE?

    thinkphp开发用什么IDE?thinkphp开发用什么IDE?thinkphp开发用什么IDE?thinkphp开发用什么IDE?

    thinkphp开发用什么ide? Zend Studio Zend Studio是一款来自Zend公司旗下的一款经典PHP IDE。 Zend Studio是一个屡获大奖的专业PHP集成开发环境,具备功能强大的专业编辑工具和调试工具,支持PHP语法加亮显示,支持语法自动填充功能,支持书签功能,支持…

    2026年9月25日 • 用户投稿
    200
  • workerman与thinkphp结合使用的方法

    workerman与thinkphp结合使用的方法workerman与thinkphp结合使用的方法workerman与thinkphp结合使用的方法workerman与thinkphp结合使用的方法

    下面由workerman入门教程栏目给大家介绍将workerman与thinkphp结合的方法,希望对大家有一定的帮助。 运行workerman需要安装pcntl和event或者libevent pcntl安装方法: 以php-5.5.20为例,实际情况按自己安装的PHP目录 立即学习“PHP免费学…

    2026年9月25日 • 用户投稿
    200
  • 如何在ThinkPHP6中使用Shardig数据库

    在现代web应用程序的开发过程中,数据量通常很大,为了应对这种情况并提升数据库性能,通常会采用分库分表的方式进行数据管理。sharding数据库则是一种常见的实现方式,它可以将数据分散在多个不同的数据库集群上进行管理,以此实现数据的高可用性和性能提升。本文将介绍如何在thinkphp6中使用shar…

    用户投稿 2026年9月24日
    000
  • 在ThinkPHP6中使用权限控制技术

    权限控制技术在现代web应用程序开发中越来越重要。它可以帮助开发者管理用户权限、控制数据访问和保护系统安全。而thinkphp6是一个强大的php框架,提供了多种权限控制技术,本文将介绍其中的一些。 认证与授权 在ThinkPHP6中,认证和授权是两个不同的概念。认证通常是指验证用户的身份,判断用户…

    用户投稿 2026年9月24日
    100
  • 如何在ThinkPHP6中使用MongoDB进行数据存储

    随着互联网的不断发展,数据的存储和处理越来越成为一个重要的方向。而mongodb则是一种适用于大规模数据和高性能应用场景的nosql数据库,它的高性能和可扩展性得到了众多开发者的拥护。在这篇文章中,我们将介绍如何在thinkphp6中使用mongodb进行数据存储。 一、安装MongoDB拓展 首先…

    用户投稿 2026年9月24日
    100
  • MySQL中SQL注入防范 SQL注入攻击的预防与应对措施

    sql注入的防范核心在于参数化查询。具体措施包括:1.始终使用参数化查询,将用户输入视为数据而非可执行代码;2.对输入进行过滤与校验,如验证格式、转义特殊字符;3.遵循最小权限原则,限制数据库账号权限;4.控制错误信息输出,避免暴露敏感细节;5.定期更新框架与插件,及时修补漏洞。这些方法结合使用能有…

    2026年9月24日
    100
  • 如何使用ThinkPHP6实现验证码功能

    在网站或应用的登录、注册、找回密码等登录认证系统当中,验证码功能已经成为常见的一种用户验证方式。验证码功能能够有效防止恶意攻击和机器人攻击,保护用户数据和系统安全。本文将介绍如何使用thinkphp6框架实现验证码功能。 一、ThinkPHP6验证码功能介绍 ThinkPHP6框架中的验证码功能可以…

    用户投稿 2026年9月24日
    000
  • 利用ThinkPHP6实现动态配置

    随着互联网技术的不断发展,如何快速、灵活地配置系统已成为开发人员的必修课。因此,动态配置已经成为现代软件开发的重要组成部分。在这篇文章中,我们将介绍如何使用thinkphp6实现动态配置的方法。 一、什么是动态配置? 动态配置是通过代码实现对系统的配置进行修改的过程。传统的系统配置一般需要修改配置文…

    用户投稿 2026年9月24日
    000
  • 前端危!Gemini 3 内测结果获网友一致好评,“有史以来最强前端开发模型”

    前端危!Gemini 3 内测结果获网友一致好评,“有史以来最强前端开发模型”前端危!Gemini 3 内测结果获网友一致好评,“有史以来最强前端开发模型”前端危!Gemini 3 内测结果获网友一致好评,“有史以来最强前端开发模型”前端危!Gemini 3 内测结果获网友一致好评,“有史以来最强前端开发模型”

    谷歌下一代旗舰模型gemini 3未发布便已悄然走红! 原因很简单:强,实在是太强了。 在国外社交媒体平台上,一大波网友激动地分享了 Gemini 3 的内测结果—— 从曝光的这些案例来看,Gemini 3尤为擅长前端、SVG 矢量图生成,而且多模态能力变得更强。 立即学习“前端免费学习笔记(深入)…

    2026年9月23日 • 用户投稿
    100
  • ThinkPHP6发送推送通知:实现用户消息推送

    ThinkPHP6发送推送通知:实现用户消息推送 引言:在现代的Web应用程序中,消息推送已成为提供实时通知和即时更新的重要功能之一。用户在操作过程中会收到及时的消息提醒,提升用户体验和交互性。本文将介绍如何在ThinkPHP6框架中实现用户消息推送功能,并附带代码示例。 一、准备工作 确保已经安装…

    2026年9月21日
    000
  • ThinkPHP6用户登录与注册:实现用户认证功能

    ThinkPHP6用户登录与注册:实现用户认证功能 引言:用户登录与注册是大多数Web应用程序的常见需求之一。在ThinkPHP6中,通过使用内置的用户认证功能可以轻松实现用户的登录与注册操作。本文将介绍如何在ThinkPHP6中实现用户的认证功能,并附上代码示例。 一、用户认证功能简介用户认证是指…

    2026年9月21日
    300
  • ThinkPHP6接口限流与防刷:保护接口的安全性

    ThinkPHP6接口限流与防刷:保护接口的安全性 在现代互联网应用中,接口的使用越来越广泛,很多应用都依赖于各种接口来进行数据传输和交互。然而,由于接口的开放性和便利性,也容易成为攻击者的目标,因此保护接口的安全性变得至关重要。在ThinkPHP6框架中,提供了一些防护机制和限制措施,帮助我们有效…

    2026年9月21日
    200
  • 自定义协议与主流框架(如ThinkPHP)结合

    在thinkphp中实现自定义协议可以通过中间件机制。具体步骤包括:1. 创建中间件类customprotocolmiddleware,解析和验证请求的json格式和字段。2. 在应用配置文件中添加该中间件,使所有请求经过处理。通过这种方式,可以满足特定业务需求并提升应用的灵活性和可扩展性。 在开发…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信