Кто-то из нас двоих идиот. Код (Text): !$errors=Validator::Run($_POST) ->NoEmpty("Переменная {var} не должна быть пустой") ->MaxLength(30,"максимальная длина {var} {arg[1]} символов") ->HtmlSpecialEscape() Где он самого себя возвращает у HtmlSpecialEscape()? в $errors ты возвращаешь инстанс Validator? А какая тогда в жопу проверка с отрицанием "!" Или все же там false/null? Тогда получается ты в chain методе можешь вернуть что-то отличное от инстанса класса? Ты гонишь.
а ну это я ошибся,сор, вот так понятно? PHP: <? if(!$errors=Validator::Run($_POST) ->NoEmpty("Переменная {var} не должна быть пустой") ->MaxLength(30,"максимальная длина {var} {arg[1]} символов") ->HtmlSpecialEscape() ->End()){ print "Офыбок нетушки"; }else{ print_r($errors); } ?> PHP: <? class Validator { function __construct(){ die("Фигуфки"); } } ?>
Нет, это ты ерунду написал Конструкция вида Код (Text): if(!$errors=Validator::Run($_POST) ->NoEmpty("Переменная {var} не должна быть пустой") ->MaxLength(30,"максимальная длина {var} {arg[1]} символов") ->HtmlSpecialEscape()){ }else{ print_r($errors); } Не имеет смысла, если у тебя возвращается всегда сам объект. Потому что всегда будет выполняться else, независимо от результатов работы. Т.е. весь if теряет смысл. Возможный вариант правильного использования Код (Text): Validator::Run($_POST) ->NoEmpty("Переменная {var} не должна быть пустой") ->MaxLength(30,"максимальная длина {var} {arg[1]} символов") ->HtmlSpecialEscape(); if($errors = Validator::getErrors()) { print_r($errors); } Ошибки мы должны получить отдельно и проверить их наличие отдельно. Еще один вариант правильного использования. Это наличие финального метода завершающего цепочку вызовов. И уже этот метод может возвращать false/true/null или просто массив с ошибками. Код (Text): if(!$errors=$Validator::Run($_POST) ->NoEmpty("Переменная {var} не должна быть пустой") ->MaxLength(30,"максимальная длина {var} {arg[1]} символов") ->HtmlSpecialEscape() ->validate()) { }; Мало того что ты смешал фильтрацию с валидацией - бог с ним. Не самый смертельный случай, если правильно пользоваться. Но твои примеры абсолютно бессмыслены и поэтому бесполезны. Выводов может быть только два. Ты действительно так пишешь и считаешь это правильным (это мрак полный). Ты допустил ошибку в примере и боишься это признать.
Mr.M.I.T., ты уж извини, но действительно твой подход имеет кое-какие изьяны: 1. Лично для меня он достаточно нечитаем. Ты засунул в иф — присвоение переменной значения, отрицание и ChainingMethod — if просто распух. 2. Непонятно, как его расширять — под каждый проект изменять дописывать класс? 3. У тебя весь $_POST проверяется одними правилами — но ведь для разных полей нужны разные правила! Емейл проверить на валидность, пароль — на силу, подтверждение пароля — на совпадение с оригинальным паролем и так далее 4. Позволю себе согласиться с Simpliest в том, что HtmlSpecialEscape — это всё-таки малость из другой оперы. Все-таки изменение данных и проверка их на правильность — это совершенно разные вещи, которые должны производится в разных частях приложения: проверка — при получении данных от пользователя, а изменение — при выводе на экран/записи в базу. Вот моё предложение (писал на ходу, хотел подать только идею). Думаю, оно достаточно очевидно, но всё-же почему-то все его опасаются: PHP: <?php $form = new Validator; $form ->newString(Request::get('nickname')); ->addRules( new FW\Rules\NotEmpty(), new FW\Rules\Length(4, 16), new FW\Rules\RegExp('/^[a-z]+$/i') ); ->newString(Request::get('password')) ->addRules( new FW\Rules\NotEmpty(), new FW\Rules\MinLength(3), new App\Rules\PasswordStrength(40) ); ->newString(Request::get('confirm')) ->addRules( new FW\Rules\NotEmpty(), new FW\Rules\Equals(Request::get('password')) ) ->newString(Request::get('email')) ->addRules( new FW\Rules\NotEmpty(), new FW\Rules\ValidEmail(Request::get('email')) ); if ($form->isValid()) { reg_user(Request::get('nickname'), Request::get('password'), Request::get('email')); } else { print_r($form->getErrors()); } При том, допустим, в нашем фреймворке (FW) есть какой-то список базовых правил. Но наше приложение требует какие-то специфические правила (например, проверка того, что данный код — это действительно валидное название координат в формате XX.YY:ZZ.KK) — такая проверка не требуется в фреймворке по-умолчанию и будет излишней для других проектов. Мы создаем это правило в нашем приложении и не нагружаем фреймворк! ( App\Rules\PasswordStrength(40) в примере )
TheShock ёблянах =) этот код что ты написал, я даже обсуждать не хочу 1. Ну дак вынь из ифа PHP: <? $errors=validator bla bla bal if(!$errors) ?> 2. Я для кого писал? PHP: <? $validator->Exec("myvalidator") $validator->ExecErrors("myDefaultErrorsData"); ?> 3. Есть там, мне просто лень было писать очевидное validator::Run($_POST,array("key1","key2")) 4. Какая нафиг разница из какой оно оперы? главное удобно и практично
Mr.M.I.T., вот посмотри — я тебе корректно и грамотно ответил, без всяких оскорблений, или наездов. Вот хули эти понты "твой код я даже обсуждать не хочу"? Конечно не хочешь, потому-что в отличии от твоего говна тут обсуждать нечего — всё логично, красиво и понятно
TheShock я тебе вроде предлагал if...else переписать? =) ты мне нифига не грамотно ответил, ты даже не вник и написал ересь вот я те отвечаю более расширено =) 1. то что ты написал в 2 раза больше моего, больше жрёт ресурсов 2. то что ты написал вообще заменяется парой обычных ифов 3. то что ты паписал типичный пример ООП ради ООП ps/ перепиши уже весь php давай не мелочись так и должно быть
Мне тут еще товарищ предлагает воспользоватся YAML для валидации. Что-то типа такого: Код (Text): UserReg: Nickname: NotEmpty: true Length: [4, 16] RegExp: /^[a-z]+$/i Password: NotEmpty: true MinLength: 3 PasswordStrength: true Confirm: NotEmpty: true Equals: Password Email: NotEmpty: true ValidEmail: true PHP: <?php $form = new YamlValidator ('UserReg', $_REQUEST); if ($form->isValid()) { user_reg(/**/); } else { print_r($form->getErrors()); }
что за тупые нлп-приёмы? при чём тут "переписать вес пхп"? я показал стандартные, всем известные возможности пхп. если ты гонишься за размером кода — пиши на HQ9+, это язык как раз для тебя. а на счёт ресурсов — утверждение голословное. доказательства. тем более оно у меня в два раза больше, потому что я написал разные проверки четырёх полей, а ты все поля проверил одинаково (ну и глупость, боги!) конечно. всё заменяется парой обычный Ифов. вообще весь код можно переписать используя только циклы, и ифы, не применяя ни функций ни классов. как ты думаешь, почему от этого отказались? эээх. хотел прокомментировать, да не буду...
ну понесло, ответить видно больше нечего потому что сам всё понял? отвечу на одну здравую фразу я расчитывал на вашу фантазию. PHP: <? $errors=Validator::Run($_POST) ->NotEmpty("Ошибка тут",array("key1","key2")) ->maxLength(30,"Ошибка тут",array("key3","key5")) ->HtmlSpeclEscape(/*...логика ясна ..*/); /* Ещё */ $errors=Validator::Run($_POST,array("key1","key2")) ?>
может пожмете друг другу руки и типа того... Или хотя бы четко сформулируйте недостатки не понравившихся реализаций. Идеально было бы эти недостатки решить потом совместно - то есть прийти к общему мнению. Этого очень недостает в дискуссиях на этом форуме, потому что все выделываются своими способностями и решениями. Конечно идеального не существует. Но лучше остановиться на более-менее приемлемым, или просто остановится. А наезжать друг на друга - дерьмовое это дело. Не так ли?
kostyl да он козёл просто =)) не вникая пишет, думать не хочет я голосую на отмену валидаторов как единых структур! однако в контексте этого топика, решение я привёл аж 2 раза смысл в том чтобы выложить своё решение и обосрать чужое кто сильнее и обоснованнее чужое обосрал тот и прав
Mr.M.I.T. ну можно было хотя бы написать этот пост без слова козёл: Ну а TheShock стоило бы ответить: и было бы намного лучше...
Хватит уже хуями мериться. Как это по нашему: надо не только представить свою позицию, но и обосрать того, чья позиция отличается от твоей.
мда, типа, каждый понял в меру своей испорченности ладно плевать мне, по смоему подходу я уже достаточно постов написал