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. Любые другие предложения к моему коду будут оценены. Спасибо за совет!