Контент


Достаем напильник: Auth_User->validation

Ранее я уже упоминал о переопределении одной из библиотек с целью избавления от index.php в URL при использовании url::redirect(). Сегодня, подготавливая проект для статьи о модуле Auth (да-да, на очереди аутентификация), столкнулся с небольшой проблемой.

Проблема

Не буду сильно вдаваться в подробности (они будут описаны в статье), просто скажу, что в модуле Auth поставляется модель Auth_User, у которой присутствует метод validate(). Он выполняет проверку введенных данных на соответствие следующим правилам (они описаны в теле модели и извне их не изменить):

	/**
	 * Validates and optionally saves a new user record from an array.
	 *
	 * @param  array    values to check
	 * @param  boolean  save the record when validation succeeds
	 * @return boolean
	 */
	public function validate(array & $array, $save = FALSE)
	{
	$array = Validation::factory($array)
		->pre_filter('trim')
		->add_rules('email', 'required', 'length[4,127]', 'valid::email')
		->add_rules('username', 'required', 'length[4,32]', 'chars[a-zA-Z0-9_.]', array($this, 'username_exists'))
		->add_rules('password', 'required', 'length[5,42]')
		->add_rules('password_confirm', 'matches[password]');

Если вы читали статью в справочнике об объекте Validation (нет?! так прочтите :) ), то все должно быть понятно. Сперва данные фильтруются (функция trim() удаляет пробелы слева и справа в строке), далее добавляются правила:

  • Адрес электронной почты должен присутствовать (required), быть от 4 до 127 символов длиной (length[4,127]), ну и быть собственно корректным электронным адресом (valid::email)
  • Имя пользователя должно присутствовать, длина 4-32 символа, состоять из латинских букв, цифр, знака подчеркивания и точки (chars[a-zA-Z0-9_.]), плюс дополнительная проверка методом username_exists модели Auth_User.
  • Пароль должен присутствовать, длина от 5 до 42 символов.
  • Подтверждение пароля должно соответствовать паролю (естественно, нет смысла делать проверку длины и т.д.)

И если проблем со стандартными правилами нет, то username_exists ведет себя странно — существующие логины пропускает, а незанятые не дает зарегистрировать. Смотрим исходники:

	/**
	 * Tests if a username exists in the database. This can be used as a
	 * Valdidation rule.
	 *
	 * @param   mixed    id to check
	 * @return  boolean
	 */
	public function username_exists($id)
	{
		return (bool) $this->db
			->where($this->unique_key($id), $id)
			->count_records($this->table_name);
	}

Ошибку видите? Считаю до десяти и даю подсказку — какой будет результат, если количество записей (count_records()) будет равно нулю? Вот и я о том же. В итоге пришлось немного порыскать на форуме Kohana и выяснилось, что проблема известна, и в будущих версиях (2.4 и 2.3.2) она будет исправлена. Сейчас же остается только вручную вносить изменения, чем и займемся.

Лекарство

Единственный видимый мне способ (кроме правки непосредственно исходного файла) — копирование скрипта Auth_User.php в application/models и уже там править под себя. Т.е. мы будем использовать преимущества каскадной файловой системы (сперва класс смотрится в application, и только потом в modules). Вот какие мы внесем поправки:

// файл application/models/Auth_User.php
// Строка 35. Вместо
     ->add_rules('username', 'required', 'length[4,32]', 'chars[a-zA-Z0-9_.]', array($this, 'username_exists'))
// пишем
     ->add_rules('username', 'required', 'length[4,32]', 'chars[a-zA-Z0-9_.]', array($this, 'username_available'))
 
// Строка 124. Заменяем метод username_exists на свой метод username_available:
	public function username_available($id)
	{
		return !$this->db
			->where($this->unique_key($id), $id)
			->count_records($this->table_name);
	}

Сохраняем, проверяем. Теперь все тип-топ.

Постскриптум

Подобные сырости встречаются, поэтому я и решил создать для них отдельную рубрику «Напильник». До встречи!

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Опубликовано в напильник.

Теги: , , , , .


Комментарии (0)

Будьте в курсе обсуждения, подпишитесь на RSS ленту комментариев к этой записи.



Можно включить подсветку кода: <code><pre lang="">...</pre></code>
Разрешены некоторые HTML теги

или используйте trackback.