-
Notifications
You must be signed in to change notification settings - Fork 52
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
strange actual value #159
strange actual value #159
Conversation
Может соответствующий тест добавить? |
Да надо тест добавить, явно так не должно работать |
API ломается public function getSafeValue()
{
if ($this->imported)
return $this->value;
return $this->default;
} Чем он не подходит, так что хочется getActualValue сделать почти таким же как он? getActualValue возвращает либо импортированное значение если импорт прошел успешно либо значение переданное для импорта либо если не было ничего импортировано, то дефолтное. Не думаю что это security hole, скорее оно так задумано, что бы в форме выводить либо верное значение либо то какое ввел пользователь. |
я видимо неудачный пример привел. ты отдаешь отчет в том примитив инт. может вернуть массив или строку.
ничем. в приведенном примере код надо допилить до
тогда перепиливаем safe и проверяем не |
да и причем именно empty ибо следующий шаг это для листов и примитива сет по дефолту должен возвращаться массив. |
Если по мне так это не нормально, это дыра в безопасности. проблема в том что если в форме указал default ( как в примере ) вместо ожидаемого мною дефолта я получу не просто пустое значение так куда хуже неправильное! O_o) |
не могу расшифровать мысль:
Какая дыра в безопастности? Никто не знает как метод работает? Или его заставляют использовать? Можно тогда добавить комментарий к нему. Если нехватает какого-то метода - так может написать новый, вместо подгонки старого под желаемое? |
pupkinV@f650741
только не это! ибо три существующих не всегда оправдывают свои названия. Хотя. getPupkinValue, getStevValue, getSolowebValue, getDovgValue |
Может дождемся тестов? Я обещаю, что на днях разберусь как их запускать и как их надо писать и покрою это тестами. Но видать проблема в том что слово actual мы по разному понимаем. Меня интересует либо валидное значение пользователя, либо мое дефолтное. Всё! Остальное в $_REQUEST['any']. |
Алексей,
Вот комментарии к методам не помешали бы, но они не решат вопрос, так как примитивы используются для импорта в объект. После импорта ожидается что у меня в форме все хорошо и данные безопасны для сохранения в базу и логично т.к все должно соответствовать правилам формы. Если это не так то значит правила не правильно указаны. Если нужна отличная логика, с забором не валидированного значение Raw это уже часный случай. |
Пообсуждав еще предлагаю следующий вариант:
|
Да собсно это совместное решенеи с @AlexeyDsov сделать именно так. Идеи, возражения ребята ? |
А мне больше по нраву предложение из соседнего реквеста - если попытка импорта не удалась, то isImported() == false. |
а варианты рассматриваются? может спросить сообщество? мне кажись, что люди ожидали именно то, что реализует мой пулл. |
isImported тоже трактуется не однозначно, толи это была-ли попытка импора (пытались ли вообще что то заимпортить) или-же заимпортилось ли валидное значение значени. Мы сейчас @dovg о двух разных вещах говорим, наверное. |
@dovg это немного другое, к этому нужно отдельно подходить
тк, это пересекается с логикой трактования - что-есть ошибка при импорте. Это другое. |
Есть те кто сидит на местере на продакшигне ? |
Я не понимаю что такое "была ли попытка импорта". Конечно была, примитив же есть, его форма не пропустит и попробует импортнуть в любом случае, т.е. после вызова import imported по логике попытки надо ставить в true всегда |
getActualValue можно выставить в depricated да, оно дублирует getSafeValue, кейса получения raw value по такой логике в реальном коде я не представляю |
Что другое? ИМХО isImported вне формы вообще не нужен. Была ли попытка импорта - это крайне спорно. Например для boolean примитивов в html form отсутствие значение всегда трактуется как false, так что попытка была. |
@anisimovt > Я не понимаю что такое "была ли попытка импорта" Это когда у тебя форма есть но:
А сдругой стороны трактовать то можно и по другому, к примеру, был лы удачно заимпорчен примитив. те оказались ли данные для примитива валидными и импорт прошел успешно, чувствуете разницу :) Ну понятное дело что чтобы однозначно узнать прошел ли импорт валидно мы также смотрим errors |
@soloweb для boolean примитивов по существующей логике данные в скопе есть всегда. Прошу это учитывать ) |
Для примитива не было данных в скопе - импорт всё равно был, попытка была, ошибка проставляется Либо вообще не было import* для формы - это уж пусть форма скажет, а не примитив |
@anisimovt Либо вообще не было import* для формы - это уж пусть форма скажет, а не примитив ок а если так Primitive::any()->import(...) нету формы :) |
@dovg у boolean вообще все весело public function isImported()
{
return ($this->imported && $this->value);
} те isImported не просто возвращает а еще и в зависимости от того есть ли у нас True в value - магия ! |
@soloweb а это как раз на случай importMore. Никакой магии ) |
#157 (comment) |
@dovg > Например, если в get нет значения, то он может прийти в post. А если не пришел вообще, то false/ В смысле разве isImported не показатель того что была попытка импорта, после чего этот флажок становится в положение True ??? Тогда причему тут откуда он пришел, была поптыка ставим True и никакой там магии, все должно быть железно :) разве нет ? |
Я может косоязычно выразился. Если ты в html сделаешь <input type="checkbox" ... >, то в случае если он не checked, в запросе не будет ничего, а если checked - то будет. |
@dovg > Если ты в html сделаешь , то в случае если он не checked, в запросе не будет ничего, а если checked - то будет. Погоди мы сейчас о логике isImported а он показывает состояние была-ли вообще попытка импорта? Правильно ? |
@soloweb в случае boolean - нет. :) Попытка импорта для boolean примитива была всегда. Таков реальный мир ) |
@dovg ну я люблю когда все очевидно и без магии, смотри у нас есть ключь imported, даже если в случае boolean будет попытка его заимпортить то оно всегда втсанет в положение True и функция isImported вернет то что надо. Тут некчему еще доп проверка, наоброт это место для неочевидного бага. |
@dovg ок вот конкретный пример $bool = Primitive::boolean(...)->importValue(false);
var_dump($bool->isImported() ); # Что выведет ? false хотя попытка импорта то была, и это очевидно ?
|
@soloweb Примитивы писались для html форм в первую очередь AFAIK. |
@dovg это почему, я вот занимался реализацие widget-ов для автогенерации и именно из-за таких и многих других неочевидностей я этого сделать не смог, а onPHP инструмент который должен решать широкий спектр задач присущих веб-фреймворку. |
Есть следующее предложение: т.е если объективно посмотреть то можно свети все к трем методам со следуюшим значением: // getValue - есть правильное актуальное значение (собственно что от формы и требуется)
// getActualValue - только правильное значение но без (default)
// getRawValue - исходное значение почему getValue(), потому что данный метод имеет основное значение при конвертации FormUtils остальное - частный случай. ваше мнение товарищи? |
Это ломает BC @stev :) так нельзя делать Смотри то что раньше должно было вернуть null станет возвращать default |
@soloweb это и коню ясно :))) это пример того что хотелось бы видеть в новой версии |
@stev я пока за #159 (comment) Потом в версии 1.2 я бы вообще выпилил getActualValue и отсавил бы вместо него метод getValueOrDefault() |
@soloweb #159 смена шила на мыла. логика в другом по факту, если указал в приметиве default - значит ты его будешь использовать если у тебя там нет нечего допускаю что может понадобиться без default. сейчас же получается, что для получения, мне необходимо что-то делать.. ручками. от случая к случаю. Притом что я конкретно указал что есть default. Спрашивается - зачем? когда можно навести порядок и это не делать |
@stev > по факту, если указал в приметиве default - значит ты его будешь использовать если у тебя там нет нечего Мы делаем интсрумент, зачем нам додумывать что там может понадобится, нам надо выплюнуть value это ведь просто геттер, зачем туда логику вкрячивать ? getValue() должен отдавать значение value и никак иначе, в противном случае это магия :) |
@soloweb магия есть сейчас! в моем понимании getValue - должен вернуть не поле класса value, а правильное значение (собственно value - так и трактуется), об этом можно судить по тому что оно фигурирует в других местах FW Если исходить, что это просто возврат поля - value, тогда с точностью наоборот получается: // getActualValue - есть правильное актуальное значение (собственно что от формы и требуется)
// getValue - только правильное значение но без (default)
// getRawValue - исходное значение а getActualValue или getValueOrDefault - второе дело.. суть одна но тогда на первое место выходит метод getActualValue (getValueOrDefault) хоть он и наоборот, но меня на данный момент устроит этот вариант. (с изменениями в FormUtils) |
@stev Такое изменения BC нах. Никто никакой проект под новую версию с таким изменением не сможет переписать. |
Моё мнение остановилось на варианте:
Теперь еще один вопрос на засыпку возник - а как вы вообще собираетесь использовать default? На примере PrimitiveIdentifier. |
@AlexeyDsov к #159 (comment) - с этим понятно Мы у себя поменяли getActualValue - так как текущая реализация странная и ее в таком виде не могли использовать. Ок, на данный момент устраивает. что касается default для PrimitiveIdentifier.
|
Товарищи, парни, сообщество! Зачем вы на_много_написали_!?
вернет RU и по моему это очевидно.
|
@pupkinV Василий мне кажется из названия getValueOrDefault очевидно что оно делает нет ? |
@soloweb ты за getValueOrDefault как я понимаю? Я жду до выходных. Неохота еще раз перепиливать метод если потом кто-нибудь опомнится и решит, что "так делать нельзя". Заявки принимаются =). Кстати авторы "Чистый код" и "Рефакоринг" (ссылаясь первый на второго :) советуют писать именно то, что делает метод, даже если название длинно. Современные IDE выполняют авто-подстановку и о длине метода не стоит беспокоится. Код страшноват порой. gAV говорило само за себя. Жаль не развидеть увиденного. Оставлять "для совместимости" gav надо оградив его от людей комментариями, нотисом в почту, красной сигнальной ракетой. И это hole. |
Уперся в свою малоопытность. В PrimitiveAlias::getActualValue является deprecated by getFormValue в котором не очень понятны намерения автора.
Внимание вопрос: имею ли я право написать |
if (is_array($this->value) && $this->value[0]) | ||
return $this->value; | ||
elseif (is_array($this->raw) && $this->raw[0]) | ||
return $this->raw; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Казалось бы не должно быть raw тута
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
эюя себе! эко я себе в спину ножом. --amend не возбраняется? для чистоты коммитов.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
со своими бранчами можно делать что хочешь, github почти всегда подцепляет
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
да и может быть все-е вместо $this->value[0] сделать isset($this->value[0]) ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тут специфичный примитив. по идее если есть массив, то у него обязательно есть 0-ой элемент. а вот raw может быть не так
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
таки фикс на это ждать/не ждать что б мержить можно было?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
готово, но вот не уверен насчет тестов. я обещался, но переключился на ветку Георгия с миграцией.
мы сможем позже влить ветку с тестами или ждем меня?
Замержил. В doc/changelog мне нужно занести автора в формате |
Vasily Alexandrovich Surikov. Ya pravilno ponyal? |
Отлично. Чейнджлог поменял и только теперь сообразил что одноименный метод надо бы еще добавить в PlainForm. |
еще пулл? |
ну этот уже замержен |
Метод getActualVal взвращает raw (!) импорт был, но не удался.
Может я чегойта не понимаю, но если я в форме впишу
получу 10000, но вот почему-то я ожидал получить 20 пользователей.
Причем getSafeValue вернет null.
Тесты не запускал, ибо не пользуюсь ими пока (не дорос), но код тестов просмотрел и ничего полезного там не нашел.
В onphp-ucheba это выпилино окло года назад (недо-beta 0.1), а до новой версии на днях добрался. =)