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

Wesley13
• 阅读 257

引言

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

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

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

本文分享自微信公众号 - 程序员小助手(mql45ea)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
2年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
2年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
2年前
Ruby on Rails 学习笔记(三)
从模型开始,先建立模型而不是建立支架 ruby script/generate model ad name:string description:text price:decimal seller_id:integer email:string img_rul:string从新迁移一下数据库rake db:migrate空模型
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Stella981 Stella981
2年前
Nginx
!(https://imagestatic.segmentfault.com/255/117/25511790966008dc5b00fd8)Nginx进程模型分析在介绍Nginx的进程模型之前我们先来给大家解释下一些常见的名词,这能辅助我们更好的了解Nginx的进程模型。作为Web服务器,设计的初衷就是为了能够处理更多的客户端的请
京东云开发者 京东云开发者
5个月前
直播预告丨大模型如何在健康医疗中挖出大大的花?
大模型时代,“应用变了”:大模型如何在健康医疗中挖出大大的花?12月1日(周五)14:0015:00开播!大模型时代,给千行百业带来了新的想象空间试想一下,大模型经过专业知识训练竟然能够成为你的健康医疗助手曾经科幻片中的场景,正一步步成为现实这一期,我们将
京东云开发者 京东云开发者
5个月前
直播预告 | 大模型时代 “应用变了”:看大模型如何跑进零售电商应用
走进零售电商,大模型能做什么?今年11.11,应用大模型带来成效显著今天下午2:00,京东云视频号准时直播看京东零售如何破题新解法,大小模型协同大模型将走向多模态,走向具身智能