#php #symfony #validation #symfony4
#php #symfony #проверка #symfony4
Вопрос:
Я пытаюсь использовать ограничение проверки Symfony NotEqualTo
, чтобы предотвратить использование определенного строкового значения.
Как указано в документации, это должно быть возможно с использованием ограничения NotEqualTo. Это работает, хотя и с учетом регистра. Однако мне нужно, чтобы это также работало без учета регистра. Я мог бы решить это, создав пользовательское ограничение, но, возможно, я просто упускаю из виду более простое решение.
class Foo
{
/**
* @AssertLength(
* min=4,
* max=150
* )
* @AssertNotEqualTo(
* value="bar"
* )
*/
private $name;
}
В этом примере зарезервированным ключевым словом является bar
.
Symfony не разрешит bar
, но разрешит Bar
, BAR
, BaR
, …
Могу ли я использовать ограничение проверки Symfony NotEqualTo
без учета регистра?
Комментарии:
1. NotEqualTo не учитывает регистр. NotEqualTo — это != сравнение. Иначе, если бы я сделал «cat» != «CaT», он вернул бы false, потому что они равны. Тот, который чувствителен к регистру, не имеет значения. «Это ограничение сравнивается с использованием != , поэтому 3 и «3» считаются равными. Используйте NotIdenticalTo для сравнения с !==.»
2. Я просто пошел дальше и проверил это на своей установке Symfony, она фактически не чувствительна к регистру.
3. @TimHinz Я предполагаю, что OP хочет bar, Bar, BAR и т. Д. должно рассматриваться как равное. оно сравнивается с != так что они определенно рассматриваются как не равные.
4. @TimHinz спасибо за ваш ответ. Но я действительно намерен разрешить все возможные варианты регистра, на что намекал Якуми
Ответ №1:
Это невозможно с NotEqualTo
, как было подтверждено ранее.
Простой способ решить проблему — использовать Regex
ограничения из строки
/**
* @AssertRegex(
* pattern="/^(bar)$/i",
* match=false,
* message="'Bar' is a reserved name",
* )
*/
private $name;
Также возможно создать собственное пользовательское ограничение. Но я не чувствую, что писать код безопаснее.
Комментарии:
1. Эй, Томас, тбх, это даже лучшее решение! (потому что это проще, и все уже построено). Я бы не возражал, если бы вы отметили свой собственный ответ в качестве решения; o)
Ответ №2:
NotEqualTo
сравнивает его значения через !=
. Поскольку 'bar' != 'BAR'
вы не можете его изменить.
Однако вы, вероятно, могли бы легко добавить проверку с помощью функции обратного вызова для сравнения строчных версий обоих значений. Или вы могли бы написать свое собственное ограничение и валидатор: https://symfony.com/doc/current/validation/custom_constraint.html
Вероятно, вы хотите расширить Symfony/Component/Validator/AbstractComparison (уже предоставляет атрибут / свойство «value») и соответствующий валидатор.
В духе полного раскрытия: OP нашел лучший способ решить свою проблему: используя встроенное ограничение регулярных выражений (см. Ответ ниже).
Комментарии:
1. Я нашел некодирующее решение проблемы, я добавил его в качестве ответа, спасибо, что подтвердили мои подозрения о
NotEqualTo