0

0

Laravel访问器?模型访问器如何定义?

星降

星降

发布时间:2025-09-03 09:28:01

|

206人浏览过

|

来源于php中文网

原创

Laravel访问器通过get[属性名]Attribute方法在获取模型属性时修改值,如格式化日期、组合字段或解密数据,实现数据的自动处理与转换。

laravel访问器?模型访问器如何定义?

Laravel 访问器允许你在获取 Eloquent 模型属性时修改其值,本质上是在读取数据时提供一个“getter”方法。你可以使用访问器来格式化日期、加密数据、组合字段等等。定义访问器非常简单,只需在模型中创建一个以

get[属性名]Attribute
命名的方法即可。

解决方案:

定义 Laravel 模型访问器,实际上就是为模型属性创建一个“get”方法。这允许你在从模型中获取数据时,对该属性的值进行修改或格式化。

模型访问器如何定义?

定义访问器的方法是在你的 Eloquent 模型中创建一个方法,该方法遵循特定的命名约定:

get[属性名]Attribute
。例如,如果你想创建一个访问器来格式化
created_at
属性,你可以定义一个名为
getCreatedAtAttribute
的方法。

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 获取用户创建日期的格式化版本.
     *
     * @param  string  $value
     * @return string
     */
    public function getCreatedAtAttribute($value)
    {
        return date('Y-m-d H:i:s', strtotime($value));
    }

    /**
     * 获取用户的全名.
     *
     * @return string
     */
    public function getFullNameAttribute()
    {
        return $this->first_name . ' ' . $this->last_name;
    }
}

在这个例子中,

getCreatedAtAttribute
接收原始的
created_at
值,并使用
date()
函数将其格式化为
Y-m-d H:i:s
格式。当你在代码中访问
$user->created_at
时,你将获得格式化后的日期字符串,而不是原始的数据库值。

另外,

getFullNameAttribute
展示了如何组合多个字段。它将
first_name
last_name
属性组合成一个
full_name
属性。你可以像访问任何其他属性一样访问
$user->full_name
,而无需手动拼接字符串。

访问器的工作原理是 Laravel 会自动检测模型中以

get[属性名]Attribute
命名的方法。当你尝试访问该属性时,Laravel 会调用这个方法,并将方法的返回值作为属性的值返回。

访问器能做什么?

访问器不仅仅是简单的格式化工具。它们可以用于执行各种操作,例如:

  • 数据转换: 将数据库中的原始数据转换为更易于使用的格式,例如将字符串转换为数组或对象。
  • 数据组合: 将多个字段组合成一个逻辑属性,例如将
    first_name
    last_name
    组合成
    full_name
  • 数据加密/解密: 在获取敏感数据时,对其进行解密操作。
  • 数据计算: 根据其他属性计算出一个新的属性值,例如根据订单中的商品计算总价。
  • 权限控制: 根据当前用户的权限,返回不同的属性值。

何时应该使用访问器?

一般来说,当需要在每次访问属性时都执行相同的逻辑时,就应该使用访问器。这可以避免在代码中重复编写相同的逻辑,提高代码的可维护性。

一个常见的错误是过度使用访问器。如果只需要在特定情况下修改属性值,那么使用访问器可能不是最佳选择。在这种情况下,直接在需要修改属性值的地方进行修改可能更简单。

魔法映像企业网站管理系统
魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

下载

如何使用访问器进行数据加密和解密?

你可以使用访问器来加密和解密敏感数据,例如用户的密码或信用卡信息。但是,需要注意的是,在数据库中存储加密数据是更安全的方法。

以下是一个使用访问器进行数据解密的示例:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Crypt;

class User extends Model
{
    /**
     * 获取解密后的信用卡号.
     *
     * @param  string  $value
     * @return string
     */
    public function getCreditCardAttribute($value)
    {
        try {
            return Crypt::decryptString($value);
        } catch (\Exception $e) {
            return null; // 或者抛出异常,取决于你的需求
        }
    }
}

在这个例子中,

getCreditCardAttribute
方法使用
Crypt::decryptString()
函数来解密
credit_card
属性的值。需要注意的是,如果解密失败,该方法会返回
null
。你需要根据你的需求来处理解密失败的情况。

使用访问器进行数据加密的示例:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Crypt;

class User extends Model
{
    /**
     * 设置加密后的信用卡号.
     *
     * @param  string  $value
     * @return void
     */
    public function setCreditCardAttribute($value)
    {
        $this->attributes['credit_card'] = Crypt::encryptString($value);
    }
}

需要注意的是,这里使用了

setAttribute
方法,也就是所谓的修改器,而不是访问器。修改器用于在设置属性值时修改其值,而访问器用于在获取属性值时修改其值。

访问器和修改器有什么区别

访问器和修改器是 Laravel Eloquent 模型中两个非常重要的概念。它们都允许你修改模型属性的值,但它们的作用时机不同。

  • 访问器 (Accessor):获取 模型属性的值时被调用。
  • 修改器 (Mutator):设置 模型属性的值时被调用。

简单来说,访问器是“getter”,修改器是“setter”。

访问器和修改器都遵循特定的命名约定。访问器的命名约定是

get[属性名]Attribute
,修改器的命名约定是
set[属性名]Attribute

总结:

Laravel 的访问器提供了一种优雅的方式来修改和格式化模型属性的值。它们可以用于执行各种操作,例如数据转换、数据组合、数据加密/解密等等。理解访问器的工作原理以及何时应该使用它们,可以帮助你编写更简洁、更可维护的代码。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

317

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

276

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

370

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

232

2023.09.22

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号