如何验证ORM中的给定数据?

时间:2011-07-10 20:20:05

标签: php validation kohana-3 kohana-orm

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_pa​​ssword' 数据库)...如果没有提交密码 - 它将散列空字符串 反正会导致哈希。所以设置了hashed_password

然后由ORM::save()开启验证,最后 - 密码永远不可能是空的!怎么处理这个?额外 在控制器中验证?你会怎么处理它?或许一点点 有点不同的逻辑?

P.S。对我的代码的任何其他建议将不胜感激。谢谢你的建议!

1 个答案:

答案 0 :(得分:0)

我看不出你当前的方法有什么'错误'。

您可以添加条件(Model_user::signup())以检查所请求的密码是否为空,然后对其进行散列(ofc,如果是,则不设置它),因此它将保持为空并使验证失败。

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

Imho使用条件规则/过滤器也是一种很好的做法,具体取决于当前对象的状态。