在前面的小结中,我们主要学习了怎么使用视图。现在我们来解决表单提交,以及模型的创建问题。
本章节和原来的教程有比较大的区别,为了更容易理解,把模型验证部分工作交给了controller,这个做法实际上并不利于模型的完整性
修改 controller/users.php 文件,加入以下代码:
function actionRegister() { if (request_is_post()){ //从POST获取用户名和密码 $username = post('username'); $password = post('password','',false); } }
我们用到了QeePHP 自带的request_is_post函数和post函数,大家只需要阅读post函数的源代码就知道具体的原理,QeePHP还提供了 request、get、val等实用函数。
QeePHP 提供了模型级的验证方法,我们先用常规方法实现
if (request_is_post()){ do { //从POST获取用户名和密码 $username = post('username'); $password = post('password','',false); // 对输入数据进行验证 $errors = array(); if (strlen($username) < 5) { $errors['username'][] = '用户名不能少于 5 个字符'; } // 验证用户名有效性,更多验证方法请参考 QValidator if (!QValidator::validate_is_alnum($username)){ $errors['username'][] = '用户名只能由字母和数字组成'; } if (strlen($password) < 6) { $errors['password'][] = '密码不能少于 6 个字符'; } //验证用户是否已经注册 $user=User::find('username =?',$username)->getOne(); if (!$user->isNewRecord()){ $errors['username'][] = '用户名已经被注册'; } if (count($errors)){ $this->_view['errors']=$errors; break; } //验证完毕,保存用户 }while (0); }
补充View部分错误显示
<form name="form_user" id="form_user" action="<?php echo url('users/register'); ?>" method="post"> <fieldset> <p> <label for="username">用户名</label> <input type="text" name="username" id="username" /> <?php if (@count($errors['username'])){echo implode(',', $errors['username']);}?> </p> <p> <label for="password">密码</label> <input type="password" name="password" id="password" /> <?php if (@count($errors['password'])){echo implode(',', $errors['password']);}?> </p> <p> <input type="submit" name="Submit" value="提交" /> </p> </fieldset> </form>
时刻记住一点,QeePHP 是一个遵循“领域驱动开发”思想的框架。而领域驱动中,最重要的就是模型。而我们的大多数表单都是和模型有关的,所以在处理表单之前,首先要完善模型的定义。因为这些定义可以直接套入表单对象中,避免我们在不同的地方编写同样的逻辑,这就是 DRY 原则的最佳实践。
先前创建的 User 模型只是半成品,现在我们需要对其进行完善。一个模型由几个方面组成:
打开模型的定义文件,在 __define() 方法中可以找到模型的详细定义。这些定义分为几个部分:
在 QeePHP 的模型中,属性本身具有多种特性:
对于 todo 这样的简单应用,我们用不到这么多高级特性,所以上述内容了解一下就行了。
todo 应用中,user 模型只有两个主要属性:用户名和密码。根据需求,这两个属性有下列要求:
现在我们一步步来实现这些要求。
用户名和密码的验证,之前在controller中已经实现,密码的加密存储我们让模型自己完成。在User模型(model\user.php)内加入以下代码
static function __define() { return array ( // 用什么数据表保存对象 'table_name' => 'user', // 指定数据表记录字段与对象属性之间的映射关系 // 没有在此处指定的属性,QeePHP 会自动设置将属性映射为对象的可读写属性 'props' => array ( 'password' => array('setter' => '_password_setter'), ), ); } /** * password Setter 修改模型password值自动加密 * @param string $val */ function _password_setter($val){ $this->_props['password']=self::passwordEncode($val); $this->willChanged('password'); } /** * 密码加密实现函数 * @param string $val * @return string */ static function passwordEncode($val){ return md5($val); }
经过简单的设置,大部分要求都可以由 QeePHP 来处理了。
在users controller 增加一下代码:
// 成功后输出新建用户对象的信息 dump($user->username, 'UserName'); dump($user->password, 'Password'); dump($user->id(), 'UserID'); exit;
现在用浏览器访问 http://localhost/app/index.php?controller=users&action=register ,然后不输入任何内容就点击“提交”按钮,将可以看到如下界面:
对验证信息的反馈
现在输入用户名为:steven,密码为 123456,提交后会看到如下内容:
注册成功后的输出信息
通过 phpMyAdmin 可以看到刚刚输入的信息已经存入数据库了:
保存到数据库中的用户信息
为了方便后续开发,我们再修改一下 users 控制器的 actionRegister() 方法:
// 成功后输出新建用户对象的信息 dump($user->username, 'UserName'); dump($user->password, 'Password'); dump($user->id(), 'UserID'); exit;
改为:
// 登录成功后,重定向浏览器 return $this->_redirect(url('default/index'));
现在读者朋友们可以发挥自己的想象力,尝试输入不同的内容来测试表单的验证规则、过滤器设置,以及对重复用户名的检查 :)