Kohana ORM Проверьте, существует ли пользователь и возвращает ли сообщения View?
Я использую Kohana 3.3 в своем проекте, и я пытаюсь заставить регистрацию пользователей и вход в систему работать. Я использую Autm и Kostache от ORM для управления моим макетом / шаблонами.
Как я:
- Проверьте, существует ли имя пользователя? Если он вернется к error_msg.mustache, появится сообщение "Пользователь уже существует"
- Проверить правильность имени пользователя и адреса электронной почты в соответствии с моими правилами модели? Если нет, верните сообщение об ошибке в error_msg.mustache, указав, что проверка не удалась
В моем контроллере у меня есть:
class Controller_User extends Controller {
public function action_signup()
{
$renderer = Kostache_Layout::factory();
$this->response->body($renderer->render(new View_FrontEnd_User, 'frontend/signup'));
}
public function action_createuser()
{
try {
$user = ORM::factory('User');
$user->username = $this->request->post('username');
$user->password = $this->request->post('password');
$user->email = $this->request->post('email');
// How do I:
// Check if Username already exists? If it does return to error_msg.mustache a message "User already Exists"
// Check if email is valid? If not return error message to error_msg.mustache indicating "email is not valid"
$user->save();
}
catch (ORM_Validation_Exception $e)
{
$errors = $e->errors();
}
}
}
В моей модели:
<?php
class Model_User extends Model_Auth_User
{
public function rules()
{
return array(
'username' => array(
array('not_empty'),
array('min_length', array(':value', 4)),
array('max_length', array(':value', 32)),
array('regex', array(':value', '/^[-\pL\pN_.]++$/uD')),
),
'email' => array(
array('not_empty'),
array('min_length', array(':value', 4)),
array('max_length', array(':value', 127)),
array('email'),
),
);
}
}
Заранее большое спасибо!
2 ответа
Вы можете сделать проверку уникальности, используя валидацию и уже написанный обратный вызов. В этом есть преимущество, заключающееся в том, что ваша логика проверки вместе и очень лаконичны:
public function rules()
{
return array(
'username' => array(
array(array($this, 'unique'), array(':field', ':value')),
// ...
Так просто!
Первоначально я ответил на этот вопрос своим собственным решением, которое немного отличается от предварительно свернутой версии, но теперь, когда я знаю об этом, очевидно, я буду использовать его вместо этого:
public function rules()
{
return array(
'username' => array(
// ...
array('Model_User::unique_field', array(':field', ':value', $this->pk())),
),
// ...
);
}
public static function unique_field($field, $value, $user_id = NULL)
{
return (ORM::factory('User')->where($field, '=', $value)->find()->pk() === $user_id);
}
К сожалению, я не могу помочь вам с Kostache, но для того, чтобы проверить, существует ли уже имя пользователя, вы должны попытаться загрузить его:
$user = ORM::factory('User')->where('username', '=', $this->request->post('username'));
if ($user->loaded())
{
// The username already exists
}
Вы, вероятно, хотите сделать это, прежде чем открыть try/catch
блок.
Чтобы использовать правильные сообщения об ошибках, вы должны определить их в /application/messages
папку, как описано в руководстве по проверке ORM.