文档章节

Yii学习笔记:实现类似于ThinkPHP的模型字段映射,字段别名

吾爱
 吾爱
发布于 2013/12/29 16:53
字数 870
阅读 1177
收藏 2
点赞 0
评论 2

在TP中,我们只要在模型类中定义一个


protected $_map = array(
        'name' =>'username', // 把表单中name映射到数据表的username字段
        'mail'  =>'email', // 把表单中的mail映射到数据表的email字段
    );



这样,我们前端模板中使用 <input type=text name="name"/>


在模型收集表单数据时会自动将值同时映射到username字段上。

好处是避免数据库字段直接暴露。

但很遗憾,我在学习Yii过程中没有找到类似的机制,而Yii的类库很多,我又不敢贸然自己扩展,总觉得在某个角落里有某个类可能已经提供了解决方案,怕自己做重复无意义之举。

经过一系列的思想斗争,楼主还是决定自己动手啦。。

方法很简单,请先看代码:


<?php
class CustomModel extends CActiveRecord {
    //定义所需要收集的属性
    public $username;
    public $email;
    public $passwd;
    public $password;
    public $password1;
    
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
 
    public function tableName()
    {
        return '{{custom}}';
    }
    
    public function rules(){
        return array(
            array("username,password,email,password1","safe")
        );
    }
    //字段映射配置
    protected $_alias_ = array(
        "passwd" => "password"
    );
    //通过引用传递处理映射
    protected function afterConstruct(){
        parent::afterConstruct();
        //字段映射处理
        if(!empty($this->_alias_)){
            foreach($this->_alias_ as $a => $b){
                if(property_exists($this,$a) && property_exists($this,$b)){
                    $this->$a = &$this->$b;
                }
            }
        }
    }
}



模板:



<?php defined("APP_NAME") or exit;?>
<form action="" method="post">
    <table>
        <tr>
            <th>用户名:</th>
            <td><input type="text" name="username" placeholder="请设置您的账号名" value=""/></td>
        </tr>
        <tr>
            <th>邮箱:</th>
            <td><input type="email" name="email" placeholder="example@website" value=""/></td>
        </tr>
        <tr>
            <th>密码:</th>
            <td><input type="password" name="password" value=""/></td>
        </tr>
        <tr>
            <th>重复密码:</th>
            <td><input type="password" name="password1" value=""/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="提交"/></td>
        </tr>
    </table>
</form>



可以发现,我在表单中使用了password字段名作为密码,但是我数据库中的字段是passwd,如果直接这样收集表单,是无法将密码数据入库的。


所以我在模型类中定义了1个方法:

afterConstruct()
一个属性
protected $_alias_
我们在$_alias_这个属性里面定义映射,比如我定义了 "passwd"=>"password"的映射。

afterConstruct()这个方法是在你实例化模型类之后执行的,可以看成在 $model = new CustomModel()的时候触发,这里面主要做了一个工作,就是检测$_alias_有没有定义映射,如果有的话,我们使用php的引用传递特性来使两个字段指向同一个值。

最后,为了可以全局使用,建议在components/目录下建立一个 CommonModel类,将afterConstruct()方法放在这个类里,其他模型继承这个类就可以了,这样只要在各自的模型中定义_alias_属性即可。

/////////基于事件的处理方法

<?php
class CommonAR extends CActiveRecord{
    function init(){
        $this->onAfterConstruct = array($this,"autoMap");
    }
    //字段映射配置
    protected $_alias_ = array(
    );
    
    function autoMap($event){
        //字段映射处理
        if(!empty($this->_alias_)){
            foreach($this->_alias_ as $a => $b){
                if(property_exists($this,$a) && property_exists($this,$b)){
                    $this->$a = &$this->$b;
                }
            }
        }
    }
}



假设在components/下创建一个 CommonAR类,我们在init()方法中注册一个事件
$this->onAfterConstruct = array($this,"autoMap");
对应的事件方法就是类里面的autoMap()

然后创建具体模型的时候继承CommonAR类,定义$_alias_即可。



© 著作权归作者所有

共有 人打赏支持
吾爱
粉丝 142
博文 257
码字总数 89193
作品 0
后端工程师
加载中

评论(2)

吾爱
吾爱

引用来自“别人说我名字很长”的评论

老爱不错哦,等会哥哥也写一个

更新了,增加了一个基于事件的处理办法,代码更干净了。
别人说我名字很长
别人说我名字很长
老爱不错哦,等会哥哥也写一个
ThinkPHP中的三大自动简介

ThinkPHP中的三大自动简介 文章TAG:thinkphp 自动简介 过期已备案域名,注册就能用!终身VIP会员,畅享源码下载织梦精美仿站,火热预定中! 本文较为详细的讲述了ThinkPHP中的三大自动,是非...

thinkyoung ⋅ 2015/10/10 ⋅ 0

送给使用phpstorm+thinkphp开发者的福利

送给使用phpstorm+thinkphp开发者的福利 记得两年前的这个时候,我开始学习php。 我选择了thinkphp入门,写了我的第一个简单的cms。 当时我什么都不懂,但是这里的技术氛围好的,我每问必有大...

thinkyoung ⋅ 2015/09/07 ⋅ 0

文化人干流氓事/Thinkphp Restful API

ThinkPHP 5.1 ThinkPHP5.1对底层架构做了进一步的改进,减少依赖,其主要特性包括: 采用容器统一管理对象 支持Facade 注解路由支持 路由跨域请求支持 配置和路由目录独立 取消系统常量 助手...

文化人干流氓事 ⋅ 04/25 ⋅ 0

PHP学习路线图 最全PHP自学指南

对于广大零基础的PHP自学者,往往不知道如何系统的学习PHP,导致平白浪费了很多时间。本文将为大家带来最详细的php学习路线图,同时还会附上相应的权威教程,让广大PHP自学者少走许多弯路。 ...

W3Cschool小编 ⋅ 04/24 ⋅ 0

ThinkPHP 3.2 版本升级了哪些内容

ThinkPHP 3.2 版本升级了哪些内容 ThinkPHP 3.2发布了挺长时间了,这里也总结下这次ThinkPHP 3.2到底发生了哪些变化,方便程序员们进行开发。 前言 ThinkPHP 3.2 基于 ThinkPHP 3.1 的基础上...

thinkyoung ⋅ 2015/10/15 ⋅ 0

ThinkPHP: URL不区分大小写

ThinkPHP 要实现URL全部小写,需要修改配置:/ThinkPHP/Conf/convention.php的参数: URLCASEINSENSITIVE=true 注意如果发现不生效,请检查一下是否开启了debug模式,如果有开启,ThinkPHP默...

swingcoder ⋅ 06/11 ⋅ 0

XAMPP和ThinkPHP 5.0的安装和验证

工欲善其事必先利其器,对搞开发的攻城狮来讲,其器就是各种开发工具和开发环境,而这些在刚入门的时候由于不熟悉,往往是花费时间和精力最多的地方。记得我上大学那会,自学PHP光安装Apach...

仃虽楠 ⋅ 05/09 ⋅ 0

ThinkPHP5配置Nginx实现兼容pathinfo模式访问

ThinkPHP项目,当使用Apache服务器时,Apache服务器本身支持pathinfo模式,ThinkPHP的4种访问模式都没问题;当使用Nginx时,碰到问题,必须使用兼容模式访问。 查找很多文档,归纳原因及解决...

makingdifference ⋅ 05/11 ⋅ 0

ThinkPHP邮箱验证

Thinkphp用户注册使用邮箱验证的功能实现! 小伙伴平时在用户注册的时候,是否为邮箱验证的功能所困扰,下面思梦PHP就为大家带来了这个案例! 首先数据表的结构为: 思路就是用户注册时候我们...

思梦教育 ⋅ 01/21 ⋅ 0

ThinkPHP 框架SQL注入技术分析

  4月12号,ThinkPHP官方团队发布“ThinkPHP5.0.17&5.1.9版本发布——包含安全更新”通知,提醒用户第一时间更新框架版本,在这次更新中,包含了对由360企业安全集团代码卫士团队报送的一个...

FreeBuf ⋅ 04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 19分钟前 ⋅ 0

数据仓库技术概述(一看就是架构师写的,对我极其有用)

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于...

gulf ⋅ 20分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 22分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 26分钟前 ⋅ 0

vue获取input输入框的数据

用惯了jQuery,突然使用vue感觉很不习惯,有很多不同的地方,感觉是两个不同的思想来写前端的代码。jQuery是使用选择器($)选取DOM对象,对其进行赋值、取值、事件绑定等操作。而Vue则是通过...

王子城 ⋅ 28分钟前 ⋅ 0

竟然这就是面向对象的游戏设计?!

从程序角度考虑,许多 JavaScript 都基于循环和大量的 if/else 语句。在本文中,我们可了解一种更聪明的做法 — 在 JavaScript 游戏中使用面向对象来设计。本文将概述原型继承和使用 JavaSc...

柳猫 ⋅ 33分钟前 ⋅ 2

git cmd git bash

刚用到了Git,看到windows环境下有两个命令输入窗口 第一个是可视化图形界面,第二个是CMD,第三个是Bash。 Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能。所以建议在使用的...

东东笔记 ⋅ 35分钟前 ⋅ 0

分布式系统CAP和Base

1、分布式系统 1.1 简介 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的...

xixingzhe ⋅ 46分钟前 ⋅ 0

查看磁盘占用情况

记一次jenkins构建失败的问题 Build step 'Send build artifacts over SSH' changed build result to UNSTABLE 网上查资料都没明确表明是什么错,回忆之前处理这样的问题。第一时间想到的是不...

ManderSF ⋅ 48分钟前 ⋅ 0

数据库管理提速:SQL解析的探索与应用

前言: SQL解析是一项复杂的技术,一般都是由数据库厂商来掌握,当然也有公司专门提供SQL解析的API。SQL解析与优化是属于编译器范畴,和C语言等其他语言的解析没有本质的区别。其中分为词法分...

java高级架构牛人 ⋅ 54分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部