2NetFly
-
OOP validators – класс для проверки параметров
Хотелось бы в отдельном топике обсудить данную тему. За основу для обсуждения взято сообщение Макса в Live Journal (http://www.livejournal.com/users/max_m/15107.html).
Итак, некоторый механизм для проверки параметров однозначно нужен. Когда появляется необходимость в проверке большого количества данных, стандартный подход становится неудобным и непрактичным.
Для начала нужно определиться с задачами, которые должен решать данный класс. Мне кажется, основной задачей является проверка данных, полученных от пользователя, посредством get / post /cookies.
При проверке данных чаще всего приходится проверять следующее:
1. Заполнено ли поле.
2. Не превышает ли длина поля максимальную длину.
3. Превышает ли длина поля минимальную длину.
4. Не содержит ли поле недопустимые символы.
5. Соответствует ли поле необходимому формату (рег. выр.).
Эти 5 проверок являются базовыми, и зачастую их хватает для решения практически любых задач. Если при добавлении правила для поля указывать его тайтл, можно автоматизировать составление сообщений, которые должны отображаться в случае непрохождения проверки. Например, общие для всего проекта сообщение для третей проверки может выглядеть так:
Поле %field_name заполнено неверно. Минимальная длина поля - %min_length, текущая длина поля - %field_lengh.
В классе Validator, я считаю, нет необходимости. Базовые проверки можно реализовать в самом классе ValidatorsChain, а для расширения функциональности использовать колбэк функции / методы, набор которых можно хранить в одном файле. Я бы не изобретал велосипед и обратил внимание на HTML_QuickForm.
В метод add передавать следующие параметры:
add(string $element, string $element_title, string $message, mixed $filter, mixed $param, integer $mask);
$element - имя параметра. Для одного и того же параметра можно добавлять несколько правил, они будут дополнятся, а не перезаписываться.
$element_title – тайтл параметра. Например, "E-mail", "Логин".
$message – сообщение. В тексте сообщения можно использовать оговоренные замены. Для базовых проверок можно не указывать.
$filter – имя одного из базовых фильтров. Если необходимы вызвать функцию или метод для проверки, указывается ссылка на массив, содержащий ссылку на объект или имя класса (для функции – пустое значение), а так же имя функции / метода.
$param – значение, которые передается в качестве параметра в фильтр. Для простых фильтров (мин / макс длина, соответствие регулярному выражению) может быть скаляром, для дополнительных – ссылкой на хеш или на массив.
-~{}~ 21.11.04 12:14:
Забыл еще один момент. При регистрации параметров значение нигде указывать не нужно. Ссылку на хеш, содержащий, параметры и соответствующие им значения можно передавать непосредственно в $chain->validate(). Это удобно, когда отдельно существует метод для получения такого хеша, или уже существует готовый хеш ($_REQUEST, например).
Хотелось бы в отдельном топике обсудить данную тему. За основу для обсуждения взято сообщение Макса в Live Journal (http://www.livejournal.com/users/max_m/15107.html).
Итак, некоторый механизм для проверки параметров однозначно нужен. Когда появляется необходимость в проверке большого количества данных, стандартный подход становится неудобным и непрактичным.
Для начала нужно определиться с задачами, которые должен решать данный класс. Мне кажется, основной задачей является проверка данных, полученных от пользователя, посредством get / post /cookies.
При проверке данных чаще всего приходится проверять следующее:
1. Заполнено ли поле.
2. Не превышает ли длина поля максимальную длину.
3. Превышает ли длина поля минимальную длину.
4. Не содержит ли поле недопустимые символы.
5. Соответствует ли поле необходимому формату (рег. выр.).
Эти 5 проверок являются базовыми, и зачастую их хватает для решения практически любых задач. Если при добавлении правила для поля указывать его тайтл, можно автоматизировать составление сообщений, которые должны отображаться в случае непрохождения проверки. Например, общие для всего проекта сообщение для третей проверки может выглядеть так:
Поле %field_name заполнено неверно. Минимальная длина поля - %min_length, текущая длина поля - %field_lengh.
В классе Validator, я считаю, нет необходимости. Базовые проверки можно реализовать в самом классе ValidatorsChain, а для расширения функциональности использовать колбэк функции / методы, набор которых можно хранить в одном файле. Я бы не изобретал велосипед и обратил внимание на HTML_QuickForm.
В метод add передавать следующие параметры:
add(string $element, string $element_title, string $message, mixed $filter, mixed $param, integer $mask);
$element - имя параметра. Для одного и того же параметра можно добавлять несколько правил, они будут дополнятся, а не перезаписываться.
$element_title – тайтл параметра. Например, "E-mail", "Логин".
$message – сообщение. В тексте сообщения можно использовать оговоренные замены. Для базовых проверок можно не указывать.
$filter – имя одного из базовых фильтров. Если необходимы вызвать функцию или метод для проверки, указывается ссылка на массив, содержащий ссылку на объект или имя класса (для функции – пустое значение), а так же имя функции / метода.
$param – значение, которые передается в качестве параметра в фильтр. Для простых фильтров (мин / макс длина, соответствие регулярному выражению) может быть скаляром, для дополнительных – ссылкой на хеш или на массив.
-~{}~ 21.11.04 12:14:
Забыл еще один момент. При регистрации параметров значение нигде указывать не нужно. Ссылку на хеш, содержащий, параметры и соответствующие им значения можно передавать непосредственно в $chain->validate(). Это удобно, когда отдельно существует метод для получения такого хеша, или уже существует готовый хеш ($_REQUEST, например).