[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс валидатора
kovalevsky
Всем привет
Собственно есть вот такой "пилотный выпуск" класса валидатора
Свернутый текст


<?php


class
SimpleValidator
{

protected $patterns = array(
'login' => array(
'default' => '#^[a-z0-9_-]+$#i',
'withRussian' => '#^[a-zа-яё0-9_-]+$#i',
'withoutNum' => '#^[a-z_-]+$#i',
'onlyNum' => '#^[0-9]+$#',
'now' => '#^[a-z0-9_-]+$#i',
),

'date' => array(
'default' => '#^[0-9]{2}+\.+[0-9]{2}+\.+[0-9]{4}+$#',
':' => '#^[0-9]{2}+:+[0-9]{2}+:+[0-9]{4}+$#',
'/' => '#^[0-9]{2}+\/+[0-9]{2}+\/+[0-9]{4}+$#',
'reverse' => '#^[0-9]{4}+\/+[0-9]{2}+\/+[0-9]{2}+$#',
'now' => '#^[0-9]{2}+\.+[0-9]{2}+\.+[0-9]{4}+$#'
)
);


/*
* Устанавливает паттерн для заданной категории
* name: setPatternFor
* @param string $category
* @param string $pattern
* @return boolean
*
*/


public function setPatternFor($category, $pattern)
{
if(isset($category, $pattern))
{
if(array_key_exists($pattern, $this->patterns[$category]))
{
$this->patterns[$category]['now'] = $this->patterns[$category][$pattern];
return true;
}
else
{
return false;
}
}

else
{
return false;
}
}



/*
* Валидация данных
* name: validate
* @param string $type
* @param string $data
* @param string $pattern
* @return boolean
*
*/

public function validate($type, $data, $pattern = NULL)
{
if(isset($type, $data))
{
if(array_key_exists($type, $this->patterns))
{
if(!is_null($pattern) && array_key_exists($pattern, $this->patterns[$type]))
{
if(!preg_match($this->patterns[$type][$pattern], $data))
{
return false;
}
else
{
return true;
}
}

else
{
if(!preg_match($this->patterns[$type]['now'], $data))
{
return false;
}
else
{
return true;
}
}
}

else
{
return false;
}
}

else
{
return false;
}
}

}



Объяснять как ним пользоваться я думаю не надо. :)
Хотелось бы спросить если ли смысл лепить всё в одну функцию дальше и если есть, то, наверное, не такой вариант, как у меня?
И, если возможно, хотелось бы попросить сразу же какую-нибудь литературу по ООП, желательно для PHP >=5.3 (в мануал не отправлять)



Спустя 22 минуты, 13 секунд (15.08.2012 - 03:16) inpost написал(а):
onlynum ? is_numeric ? Ты это имел ввиду? К тому же есть уже валидатор такой среди функций на ПХП smile.gif

Спустя 2 часа, 52 минуты, 13 секунд (15.08.2012 - 06:08) Игорь_Vasinsky написал(а):
function validate($pattern, $modificators, $data)
{
return preg_match("#".$pattern."#".$modificators, $data);
}

Спустя 16 минут, 14 секунд (15.08.2012 - 06:24) kovalevsky написал(а):
inpost
Вы имеете ввиду функцию filter_var?

Игорь_Vasinsky
спасибо за идею, но мне нельзя отказываться от массива patterns, а в таком случае всё равно прийдётся пихать много if'ov.

возможно в таком случае проще будет сделать на каждый тип отдельную ф-цию?
как Вы считаете?

Спустя 47 минут, 18 секунд (15.08.2012 - 07:12) Игорь_Vasinsky написал(а):
у твоего валидатора не хватает выбора кодировки (с кирилицей в юникоде он засыпится wink.gif ), да и потом - каждый сам устанавливает кол-во символов, разрешённые символы и прочее - так что у него узкое применение.

Спустя 55 секунд (15.08.2012 - 07:13) Игорь_Vasinsky написал(а):
Цитата
inpost
Вы имеете ввиду функцию filter_var?

в том числе, а так он говорил про штатные функции - типа is_numeric()

Спустя 1 час, 37 минут, 44 секунды (15.08.2012 - 08:50) SlavaFr написал(а):
Цитата (kovalevsky @ 15.08.2012 - 04:24)
возможно в таком случае проще будет сделать на каждый тип отдельную ф-цию?
как Вы считаете?

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

interface Validator{
/**
*
@return bool
*/

public function validate();
}

последующие валидаторы должны имплементировать этот интерфейс.

Спустя 45 минут, 21 секунда (15.08.2012 - 09:36) Dezigo написал(а):
Поддерживаю как сказал SlavaFr

Вот пример:
Validator (abstract)

class Validator_Email extends Validator {

private $email;

public function Validator_Email($email) {
$this->email = $email;
Validator::Validator();
}

public function validate() {
$pattern = "/^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-]+)+/";
if (!preg_match($pattern, $this->email)) {
$this->setError('Invalid email address');
}
if (strlen($this->email) > 100) {
$this->setError('Address is too long');
}
}

}

Спустя 2 часа, 46 минут, 57 секунд (15.08.2012 - 12:23) kovalevsky написал(а):
Спасибо огромное за советы и подсказки.

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

Спустя 10 минут, 39 секунд (15.08.2012 - 12:33) SlavaFr написал(а):
Цитата (kovalevsky @ 15.08.2012 - 10:23)
И ещё хотелось бы уточнить, обязательно ли классу нужен конструктор и деструктор?

Нет. Только в случае если при создании или разрушении обэкта требуются определенные действя.

Спустя 1 час, 25 минут, 9 секунд (15.08.2012 - 13:58) inpost написал(а):
kovalevsky
Смотри, логика простая. Если без него работает - значит он не обязательный. А это значит, что их надо использовать только тогда, когда они нужны.
А всё остальное уже сам ответил и другие ответили.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.