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.

Другие вопросы по тегам