Могу ли я использовать ограничение проверки Symfony NotEqualTo без учета регистра

#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