0

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's”感到抱歉 - 我只是在调试......

我的 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()调用之前检查元素。如果你仔细看看我的代码......在我的自定义方法中,我已经设置hashed_password好了。它会使它散列。问题是如果用户没有提交任何密码(我在我的 HTML 表单中将该字段称为“密码”,但在数据库中称为“hashed_pa​​ssword”)......如果没有提交密码 - 它将散列空字符串,这将导致散列反正。就这样hashed_password定了!

然后验证被打开ORM::save()并最终打开 - 密码永远不可能为空!如何处理?控制器中的额外验证?你会怎么处理?也许有点不同的逻辑?

PS 对我的代码的任何其他建议将不胜感激。谢谢指教!

4

1 回答 1

0

我看不出您当前的方法有什么“错误”。

您可以添加一个条件 ( Model_user::signup()) 以在散列之前检查请求的密码是否为空(ofc,如果是,则根本不设置它),因此它将保持为空并使验证失败。

我在这里可以注意到的另一件事是注册方法本身是不明确的,它可以使用普通的 create() 结合密码过滤器轻松完成(以便在更改时设置 hashed_pa​​ssword 和 salt)。

恕我直言,根据当前对象的状态使用条件规则/过滤器也是一个好习惯。

于 2011-07-11T08:30:50.487 回答