Проблема с Kohana 3.2 Класс валидации. Кажется, это не отправляет исключение, когда есть ошибка - PullRequest
0 голосов
/ 25 сентября 2011

Когда данные POST отправляются на:

Auth::instance()->register( $_POST );

Затем данные проверяются ... Если это не так, я предполагаю, что класс проверки в Кохане выдает исключение. И тогда функция try-catch перехватывает его. Проблема у меня с этим методом:

$this->send_confirmation_email($_POST);

Вызывается, даже если данные недействительны. Я полагал, что если бы данные были недействительными, они пропустили бы все остальное и прыгнули бы, чтобы поймать ... Но, похоже, я ошибся, потому что я получаю неприятную фатальную ошибку из-за способа отправить электронное письмо, потому что не может найти адрес электронной почты. ..

try {
        if( ! $optional_checks ) {
           //throw new ORM_Validation_Exception("Invalid option checks");
        }

        $_POST['email_code'] = Auth::instance()->hash(date('YmdHis', time()));

        Auth::instance()->register( $_POST );

        $this->send_confirmation_email($_POST);

        // sign the user in
        Auth::instance()->login($_POST['username'], $_POST['password']);

        // redirect to the user account
        $this->request->redirect('user/profile');
     } catch (Validation_Exception $e) {

Итак, есть ли способ, чтобы метод отправки электронной почты был пропущен, если данные неверны?

Можно сказать, что я должен использовать метод check (). Вот почему это проблема:

 Validation::factory($fields)
                    ->rules('username', $this->_rules['username'])
                    ->rule('username', 'username_available', array($this, ':field'))
                    ->rules('email', $this->_rules['email'])
                    ->rule('email', 'email_available', array($this, ':field'))
                    ->rules('password', $this->_rules['password'])
                    ->rules('password_confirm', $this->_rules['password_confirm']);

            if (Kohana::config('useradmin')->activation_code) {
                    Validation::factory($fields)->rule('activation_code', 'check_activation_code', array($this, ':field'));
            }

Заранее спасибо за любую помощь.

UPDATE:

Теперь кажется, что есть проблема с классом валидации Kohana.

Вот метод в моем классе Model_User:

public function create_user($fields)
{
    Validation::factory($fields)
        ->rules('username', $this->_rules['username'])
        ->rule('username', 'username_available', array($this, ':field'))
        ->rules('email', $this->_rules['email'])
        ->rule('email', 'email_available', array($this, ':field'))
        ->rules('password', $this->_rules['password'])
        ->rules('password_confirm', $this->_rules['password_confirm']);
        //->labels($_labels);

    if (Kohana::config('useradmin')->activation_code) {
        Validation::factory($fields)->rule('activation_code', 'check_activation_code', array($this, ':field'));
    }

    // Generate a unique ID
    $uuid = CASSANDRA::Util()->uuid1();

    //CASSANDRA::selectColumnFamily('UsersRoles')->insert($username, array('rolename' => 'login'));
    CASSANDRA::selectColumnFamily('Users')->insert($uuid, array(
                            'username'      => $fields['username'],
                            'email'         => $fields['email'],
                            'password'      => Auth::instance()->hash($fields['password']),
                            'logins'        => 0,
                            'last_login'        => 0,
                            'last_failed_login' => 0,
                            'failed_login_count'    => 0,
                            'created'       => date('YmdHis', time()),
                            'modify'        => 0,
                            'role'          => 'login',
                            'email_verified'    => $fields['email_code'],
                        ));
}

Код после класса проверки выполняется . Таким образом, даже если данные недействительны, они все равно добавляют нового пользователя в базу данных.

Тест, который я делаю, с пустыми входами.

Вот правила:

protected $_rules = array(
    'username' => array(
        'not_empty' => NULL,
        'min_length' => array(4),
        'max_length' => array(32),
        'regex' => array('/^[-\pL\pN_.]++$/uD'),    
    ),
    'password' => array(
        'not_empty' => NULL,
        'min_length' => array(8),
        'max_length' => array(42),
    ),
    'password_confirm' => array(
        'matches' => array('password'),
    ),
    'email' => array(
        'not_empty' => NULL,
        'min_length' => array(4),
        'max_length' => array(127),
        'validate::email' => NULL,
    ),
);

Еще раз спасибо заранее за любую помощь.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Способ установки правил был неверным, а также способ настройки пользовательских правил проверки. Вот код, который решил проблему:

protected $_rules = array(
    'username' => array(
        array('not_empty'),
        array('min_length', array(4)),
        array('max_length', array(32)),
        array('regex', array('/^[-\pL\pN_.]++$/uD')),
    ),
    'password' => array(
        array('not_empty'),
        array('min_length', array(8)),
        array('max_length', array(42)),
    ),
    'password_confirm' => array(
        array('matches', array(':validation', ':field', 'password')),
    ),
    'email' => array(
        array('not_empty'),
        array('min_length', array(4)),
        array('max_length', array(127)),
        array('email'),
    ),
);

Проверка:

$validation = Validation::factory($fields)
        ->rules('username', $this->_rules['username'])
        ->rule('username', array($this, 'username_available'), array(':validation', ':field'))
        ->rules('email', $this->_rules['email'])
        ->rule('email', array($this, 'email_available'), array(':validation', ':field'))
        ->rules('password', $this->_rules['password'])
        ->rules('password_confirm', $this->_rules['password_confirm'])
        ->errors('register/user');
        //->labels($_labels);

    if (Kohana::config('useradmin')->activation_code) {
        $validation->rule('activation_code', array($this, 'check_activation_code'), array(':validation', ':field'));
    }

    if(!$validation->check())
    {
        throw new Validation_Exception($validation, __('Your registering information is not valid.'));
    }

Спасибо всем за поддержку!

1 голос
/ 26 сентября 2011

В этом случае класс Auth Kohana не имеет метода register () по умолчанию.

Я реализовал этот метод для использования в конкретном случае со шлюзом AmfPHP для модуля Kohana Useradmin.

Правильный способ - использовать метод модели для добавления пользователя и его ролей, вы получите бросок, если массив с полями недопустим.

Результат можно получить из Auth->instance()->register() like:

    if(! Auth::instance()->register( $_POST )) throw new Validation_Exception(...);

Попробуйте или лучше всего изменить Auth->instance()->register($_POST) на:

    $user->create_user($_POST, array(
        'username',
        'password',
        'email',
    ));
    // Add the login role to the user (add a row to the db)
    $login_role = new Model_Role(array('name' =>'login'));
    $user->add('roles', $login_role);

Это сделает вашу попытку поймать работу, необходимую для исключения Kohana_Validation.

Чтобы закончить, вот код из метода register, он может вам помочь:

/**
 * Register a single user
 * Method to register new user by Useradmin Auth module, when you set the
 * fields, be sure they must respect the driver rules
 * 
 * @param array $fields An array witch contains the fields to be populate
 * @returnboolean Operation final status
 * @see Useradmin_Driver_iAuth::register()
 */
public function register($fields) 
{
    if( ! is_object($fields) ) 
    {
        // Load the user
        $user = ORM::factory('user');
    } 
    else 
    {
        // Check for instanced model
        if( $fields instanceof Model_User ) 
        {
            $user = $fields;
        } 
        else 
        { 
            throw new Kohana_Exception('Invalid user fields.');
        }
    }
    try 
    {
        $user->create_user($fields, array(
            'username',
            'password',
            'email',
        ));
        // Add the login role to the user (add a row to the db)
        $login_role = new Model_Role(array('name' =>'login'));
        $user->add('roles', $login_role);
    } 
    catch (ORM_Validation_Exception $e) 
    {
        throw $e;
        return FALSE;
    }
    return TRUE;
}
1 голос
/ 25 сентября 2011

Есть такая вещь, которая называется if-else, которую вы можете использовать ...;)

Ваша идея о том, как работает try-catch, верна: когда в блоке try генерируется исключение, весь оставшийся в нем код пропускается, и он сразу переходит в блок catch.

Скорее всего, функция register просто не выдает исключение, как вы и предполагали, и именно поэтому ваш код не выполняет то, что, как вы думаете, должен.

...