3分钟短文:无私分享!Laravel模型使用2个小技巧
引言
上一节我们详细讲解了模型的访问器功能,可以轻易扩展模型的属性访问,灵活又标准地增强了模型的读取数据的能力。
本文我们接着往下讲,说说模型的修改器,以及模型的职责。
修改器
有没有这样一种用法:使用表单获取一个字段的输入,使用加密算法,或者摘要方式对字段处理后存入数据库,
这在数据库密码字段是常用的处理手段。
如果写操作在程序内到处都是,零散地分布在业务代码的各个地方,我们总不至于每次都要写一次相同的代码吧?
相同的业务逻辑,提取出来,抽象出来,只写一次,这才是高效代码的王道。
laravel这个注重设计模式的现代化框架,自然是不会做无用功。于是对应读取器,就有了修改器,专门用于写入数据库时起作用。
比如对于写操作,某个字段的值写入,默认使用 bcrypt 方法加密之后存入数据库。
class User extends Model {
public function setPasswordAttribute($password)
{
$this->attributes['password'] = bcrypt($password);
}
}
上述方法调用模型的 $attributes 属性,并使用自定义方法改写,在使用 ->password 属性进行赋值后,就会调用该方法的代码并执行。
我们仍然在 tinker 内进行演示:
$user = new User;
$user->password = 'blah';
echo $user->password;
// 输出 $2y$10$e3ufaNvBFWM/SeFc4ZyAhe8u5UR/K0ZUc5IjCPUvOYv6IVuk7Be7q
自定义方法
框架独立出来模型这个数据库操作层的目的,就是为了把数据操作全部集中到模型内完成,以便可以全局统一,规范地编写代码。
下面举个例子,说明一下哪些逻辑应该放在模型层操作。比如有一个视图文件内的一个展示片段:
@if ($event->started_at->isToday())
This event is occurring today!
@endif
其中 $event 是模型 Event 对象的一个实例,start_at 方法是模型的一个属性,也是数据库表的一个字段。按照之前章节的介绍,我们对其使用了访问器的方法,自动在读取的时候使用 Carbon 类返回一个实例化对象。所以上面的代码片段可以使用 isToday() 这个 Carbon 类的方法。
但是在模型层面进行类库方法的调用,有些单独,且零散。假如有些API接口要使用此方法格式化,或者别的页面也要重用这个方法,显然放在模型内更为合适。
考虑在模型内添加以下代码:
class Event extends Model {
public function occurringToday()
{
return $this->started_at->isToday();
}
}
声明一个public的公开访问的私有化方法,并操作对象的实例 $this的属性和方法。
那么上述的blade模板内的代码就可以更换如下:
@if ($event->occurringToday())
This event is occurring today!
@endif
这样逻辑摘出来就清楚的多了。而且可维护性更强。为什么?因为假如后期我们业务出现变动,不再使用 start_at 字段进行判断,可以很容易地通过修改 occurringToday 方法而达成全局生效的目的。
这样的程序就很灵活了。
写在最后
本文描述了laravel模型内很常用的两个小技巧。
- 一个是修改器,让你不必每次在写入数据的时候,考虑如何转换,如何判断,不再写重复的啰嗦的代码;
- 一个是如何优化视图文件,以及如何权衡设计技巧,让模型做模型应该做的事情,尽量在代码内把职责划分清楚。
规范的设计,能让一个项目的代码更为健壮。
Happy coding :-)
- Windows Server 2008 R2 配置AD(Active Directory)域控制器
- ios开发基础知识 - 2
- ios开发基础知识 - 1
- 为UINavigationBar添加自定义背景
- UIScrollView无法响应touches的解决方法
- WCF技术剖析之十七:消息(Message)详解(下篇)
- UITextView自动滚动的解决方案
- MVC解决Json DataGrid返回的日期格式是/Date(20130450000365)
- Easyui 让DataGrid适应浏览器宽度
- Easyui 让Window弹出居中与最大化后居中
- WCF技术剖析之十六:数据契约的等效性和版本控制
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②
- Enterprise Library Policy Injection Application Block 之二: PIAB设计和实现原理
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 重复 id 标识处理
- Magicodes.IE之花式导出
- vue列表点击切换颜色
- JVM加载过程科普
- 我没学过计算机,是怎么接了四个私活还挣了两个 iPad 的?
- Helm安装Prometheus Operator
- 【每日一题】【vue2源码学习】vue如何检测数组的变化
- JavaScript 实现输入框内容一键复制(附上 Vue 3 实现方式)
- python 迭代器/iterator与生成器/generator的区别
- CSS 实现文本超出容器范围用省略号显示(单行+多行)
- ESP8266和ROS收发消息读取模拟量控制LED亮度
- 纯 CSS 实现下拉菜单尖角图标(实心+空心)
- 3分钟短文:书接上回,Laravel数据库迁移的那些个小技巧
- 解密 Docker 挂载文件,宿主机修改后容器里文件没有修改
- SAP Spartacus的单元测试目录结构