Как проверить данные в ORM? - PullRequest
0 голосов
/ 11 июля 2011

ORM от Kohana поставляется со встроенной проверкой 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_password» в база данных) ... если пароль не указан - будет хеш пустой строкой это все равно приведет к хешу. Итак, hashed_password установлено!

Затем проверка включается ORM::save() и в заключение - пароль никогда не может быть пустым! Как с этим бороться? дополнительный проверка в контроллере? Как бы вы справились с этим? Может немного немного другая логика?

P.S. Любые другие предложения к моему коду будут оценены. Спасибо за совет!

1 Ответ

0 голосов
/ 11 июля 2011

Я не вижу, что «не так» с вашим текущим методом.

Вы можете добавить условие (Model_user::signup()), чтобы проверить, является ли запрошенный пароль пустым, прежде чем его хэшировать (ofc, не устанавливать его вообще, если он есть), поэтому он останется пустым и провалит проверку.

Еще одна вещь, которую я могу заметить, это то, что сам метод регистрации неоднозначен, это можно легко сделать с помощью обычного create () в сочетании с фильтром для пароля (так что hashed_password и salt устанавливаются при его изменении).).

Имхо также полезно использовать условные правила / фильтры в зависимости от текущего состояния объектов.

...