Kohana的ORM附带内置Kohana的验证。
据我所知,它验证了将添加到的字段
数据库。它对我不起作用,因为我需要验证字段
来自$_POST
(简单来说)。
让我举个例子。
在控制器中:
$data = Arr::extract($this->request->post(), array('username', 'password', 'password_repeatedly', 'email'));
try {
ORM::factory('User')->sign_up($data);
$this->request->redirect('sign-in');
} catch(ORM_Validation_Exception $exception) {
$errors = $exception->errors('error_messages');
echo 'There were errors:<br />';
echo Debug::dump($errors);
exit;
}
变量$data
是我需要验证的数组。方法sign_up()
是
只是我的ORM模型中的自定义方法将创建用户。为......感到抱歉
控制器中的“echo'es”和“exit” - 我只是在调试...
我的ORM模型如下所示:
public function rules() {
return array(
'username' => array(
array('not_empty')
),
'hashed_password' => array(
array('not_empty')
),
'email' => array(
array('not_empty')
)
);
}
public function sign_up($post) {
$salt = $this->_hurricane->generate_salt();
$hashed_password =
$this->_hurricane->hash_password($post['password'], $salt);
$this->username = $post['username'];
$this->hashed_password = $hashed_password;
$this->salt = $salt;
$this->email = $post['email'];
$this->save();
}
我想检查变量$data
的那三个元素是什么
不为空!正如我所说,它会在ORM::save()
之前检查元素
调用。如果ypu仔细看我的代码...在我的自定义方法中我
将hashed_password
设置为某种东西。它会使它散乱。
问题是,如果用户没有提交任何密码(我称之为
我的HTML表单中的字段'password',但是'hashed_password'
数据库)...如果没有提交密码 - 它将散列空字符串
反正会导致哈希。所以设置了hashed_password
!
然后由ORM::save()
开启验证,最后 -
密码永远不可能是空的!怎么处理这个?额外
在控制器中验证?你会怎么处理它?或许一点点
有点不同的逻辑?
P.S。对我的代码的任何其他建议将不胜感激。谢谢你的建议!
答案 0 :(得分:0)
我看不出你当前的方法有什么'错误'。
您可以添加条件(Model_user::signup()
)以检查所请求的密码是否为空,然后对其进行散列(ofc,如果是,则不设置它),因此它将保持为空并使验证失败。
我在这里可以注意到的另一件事是注册方法本身是模糊的,可以使用普通的create()和密码过滤器(以便在更改时设置hashed_password和salt)轻松完成。
Imho使用条件规则/过滤器也是一种很好的做法,具体取决于当前对象的状态。