- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Добавляй && is_int($arr['key']) в условие, в таком случае.
Давно пора функцию сделать. С айдишниками приходится работать гораздо чаще, чем со всякой другой шолухой.
К тому же если я создаю класс, то в конструкторе уже какие-то свойства класса проверяются и вроде бы этого должно быть достаточно, но нет же... Первый же вызов метода из конструктора и меня опять клонит в этом методе все переменные перепроверить.... А вдруг в конструкторе не проверилось?
Чтобы быть спокойным относительно переменных класса, их нужно делать private и задавать значения только через конструктор и только там делать валидацию. Если валидация не проходит, то конструктор должен бросать исключение. Для правильной валидации существуют такие библиотеки, как, например, Zend Validate - поначалу использование таких решений может выглядеть избыточно, но когда набивается достаточно шишек на собственных велосипедах, приходишь к выводу, что ничего особо лишнего на самом деле там нет.
Если php не является строготипизированным языком, то это не значит, что это нужно делать за него.
Проверять нужно все то, что пришло из вне.
валидация int - http://www.php.net/manual/ru/function.filter-var.php
и задавать значения только через конструктор
эм.. а если надо задать "по ходу".. не в конструкторе?
то конструктор должен бросать исключение.
Вы реально так делаете? Можно кусок кода?
Валидатор он на то и валидатор, чтобы "проверять" (возвращать тру/не тру + получать список ошибок) , а не исключения кидать.
К тому же, в зависимости от ситуации (сценарии) значение может иметь различные ограничения (к примеру, оформление заказа в админке магазина и на сайте пользователем.. в первом случае email нет смысла делать обязательным полем)
эм.. а если надо задать "по ходу".. не в конструкторе?
Тогда нужно сделать public setter-метод, запрограммировать в нем валидацию и использовать его в конструкторе для установки значения переменной класса.
Вы реально так делаете? Можно кусок кода?
Если значение переменной класса критично для функционирования всего класса, то да, я реально так делаю. Пример кода:
Валидатор он на то и валидатор, чтобы "проверять" (возвращать тру/не тру + получать список ошибок) , а не исключения кидать.
А что вы предлагаете дальше делать с тру/не тру?
А что вы предлагаете дальше делать с тру/не тру?
Пользователю в "цивильном" виде сообщать..
С отображением ему формы ввода.. с теми же данными, которые он ввёл на предыдущем шаге.. и подсветкой ошибки по соседству с полем, в котором ошибка.
Тогда нужно сделать public setter-метод, запрограммировать в нем валидацию
А чего ж сразу про сеттер не написать?
ИМХО, гиблый подход.. смешивать конструктор/сеттеры и валидацию.
Думаю, корректнее выносить валидацию в отдельный метод, в котором (в зависимости от задачи либо проверять все поля сразу, либо до первой ошибки) а вызывать явно в контроллере или неявно из методов модели. /Хотя, вполне возможно, иногда такой подход может быть оправданным.../
Пользователю в "цивильном" виде сообщать..
С отображением ему формы ввода.. с теми же данными, которые он ввёл на предыдущем шаге.. и подсветкой ошибки по соседству с полем, в котором ошибка.
Цивильное отображение - это уровень View, а валидация - уровень модели. Вьюхе, грубо говоря, все равно, как происходит проверка данных, ей важно получить список сообщений об ошибках и инструкции, куда их вставлять. А как был сформирован этот список - через исключения, возвращение false или прямым инжектом в какой-нибудь инстанс-коллектор сообщений - View может, точнее должен, не знать.
А чего ж сразу про сеттер не написать?
ИМХО, гиблый подход.. смешивать конструктор/сеттеры и валидацию.
Думаю, корректнее выносить валидацию в отдельный метод, в котором (в зависимости от задачи либо проверять все поля сразу, либо до первой ошибки) а вызывать явно в контроллере или неявно из методов модели. /Хотя, вполне возможно, иногда такой подход может быть оправданным.../
Я привел в пример класс, который реализует паттерн ValueObject. Для таких классов нет смысла создавать инстанс с заведомо неправильным значением какого-либо поля, поэтому бросание исключение там вполне уместно.
Валидация данных в модели крайне желательна, поскольку с одной и той же моделью может работать несколько контроллеров и в каждом потребуется делать валидацию, если этого не будет делать модель, а это дублирование кода со всеми вытекающими.
---------- Добавлено 07.06.2013 в 00:49 ----------
ИМХО, гиблый подход.. смешивать конструктор/сеттеры и валидацию
Вот тут вы ошибаетесь. Если public-сеттер работает с private переменной, он содержит логику валидации значений для этой переменной и существует соглашение о том, что извне задать значение переменной класса можно только с помощью этого метода, то получается единая точка ввода, которая гарантирует, что данная переменная всегда будет иметь корректное значение (или не иметь его вовсе, т.е. быть null). Такой подход очень распространен в серьезных приложениях/фреймворках. Если вы посмотрите в исходный код ZF, Symfony, Yii и т.п., то обязательно увидите примеры таких сеттеров. Самый упрощенный пример - это сеттер с type hint'ом для аргумента, где type hint как раз служит валидатором. Думаю, таких примеров можно найти предостаточно в любом "неговнокоде" на PHP.
Если появляется идея каким-то образом написать функцию или переопределить какую-то другую, так чтобы она была видна из любого куска скрипта и проверяла переменную на целое число положительно, в этом случае как лучше поступить? Как переопределить или создать свою функцию?
Если появляется идея каким-то образом написать функцию или переопределить какую-то другую, так чтобы она была видна из любого куска скрипта и проверяла переменную на целое число положительно, в этом случае как лучше поступить? Как переопределить или создать свою функцию?
Простая глобальная функция (function isId($input) { ... }) будет видна из любой точки скрипта, если будет несколько таких функций, можно сделать их статическими методами какого-либо класса:
, но это не панацея, потому что вместо кучи проверок типа is_numeric(), !empty() и т.п. вы будете писать кучу проверок типа Validator::isId(). Это немного сократит код, но не устранит проблему. Нужно изолировать данные и делать доступ к ним контролируемым, для этого (в т.ч.) и была придумана инкапсуляция.