3分钟短文:无私分享!Laravel模型使用2个小技巧

简介: 技巧源于实践

引言

上一节我们详细讲解了模型的访问器功能,可以轻易扩展模型的属性访问,灵活又标准地增强了模型的读取数据的能力。

img

本文我们接着往下讲,说说模型的修改器,以及模型的职责。

修改器

有没有这样一种用法:使用表单获取一个字段的输入,使用加密算法,或者摘要方式对字段处理后存入数据库,
这在数据库密码字段是常用的处理手段。

如果写操作在程序内到处都是,零散地分布在业务代码的各个地方,我们总不至于每次都要写一次相同的代码吧?
相同的业务逻辑,提取出来,抽象出来,只写一次,这才是高效代码的王道。

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 :-)

我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者

相关文章
|
11月前
|
机器学习/深度学习 缓存 自然语言处理
义无反顾马督工,Bert-vits2V210复刻马督工实践(Python3.10)
Bert-vits2更新了版本V210,修正了日/英的bert对齐问题,效果进一步优化;对底模使用的数据进行优化和加量,减少finetune失败以及电音的可能性;日语bert更换了模型,完善了多语言推理。
义无反顾马督工,Bert-vits2V210复刻马督工实践(Python3.10)
|
6月前
|
机器学习/深度学习 Python
【Python强化学习】蒙特卡洛法讲解及在冰湖问题中实战(图文解释 附源码)
【Python强化学习】蒙特卡洛法讲解及在冰湖问题中实战(图文解释 附源码)
133 0
|
6月前
|
机器学习/深度学习 数据采集 算法
【Python机器学习】过拟合及其抑制方法讲解及实战(图文解释 附源码)
【Python机器学习】过拟合及其抑制方法讲解及实战(图文解释 附源码)
118 0
【Python机器学习】过拟合及其抑制方法讲解及实战(图文解释 附源码)
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
【LangChain系列】第五篇:大语言模型中的提示词,模型及输出简介及实践
【5月更文挑战第19天】LangChain是一个Python库,简化了与大型语言模型(LLM)如GPT-3.5-turbo的交互。通过ChatOpenAI类,开发者可以创建确定性输出的应用。提示词是指导LLM执行任务的关键,ChatPromptTemplate允许创建可重用的提示模板。输出解析器如StructuredOutputParser将模型的响应转化为结构化数据,便于应用处理。LangChain提供可重用性、一致性、可扩展性,并有一系列预建功能。它使得利用LLM构建复杂、直观的应用变得更加容易。
274 0
|
6月前
|
机器学习/深度学习 自然语言处理 C++
【Python机器学习】条件随机场模型CRF及在中文分词中实战(附源码和数据集)
【Python机器学习】条件随机场模型CRF及在中文分词中实战(附源码和数据集)
116 0
|
6月前
|
机器学习/深度学习 自然语言处理 算法
【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)
【Python机器学习】隐马尔可夫模型讲解及在中文分词中的实战(附源码和数据集)
99 0
|
数据采集 机器学习/深度学习 自然语言处理
【英文文本分类实战】之三——数据清洗
【英文文本分类实战】之三——数据清洗
345 0
【英文文本分类实战】之三——数据清洗
|
机器学习/深度学习 固态存储 算法
【项目实践】从零开始学习SSD目标检测算法训练自己的数据集(附注释项目代码)(一)
【项目实践】从零开始学习SSD目标检测算法训练自己的数据集(附注释项目代码)(一)
521 0
|
编解码 固态存储 算法
【项目实践】从零开始学习SSD目标检测算法训练自己的数据集(附注释项目代码)(二)
【项目实践】从零开始学习SSD目标检测算法训练自己的数据集(附注释项目代码)(二)
310 0
|
机器学习/深度学习 人工智能 资源调度
如何用YOLOv5玩转半监督(附源码实现)
如何用YOLOv5玩转半监督(附源码实现)
470 0