Как разрешить пустые значения в валидаторах symfony2 - PullRequest
26 голосов
/ 22 сентября 2011

Я хотел бы применять валидаторы к свойствам объекта, только когда значение не пустое, т. Е.

Теперь стандартное поведение Symfony:

class Entity
{
    /**
     * @ORM\Column(type="string", nullable=true)
     * @Assert\Email()
     */
    protected $email;
    (...)
}

этот объект не пройдет проверку, если электронное письмоимеет значение null или пустую строку, есть ли способ сообщить валидатору, что он должен быть валидным, пустым значением и валидировать, только если в поле есть данные?

PS Я знаю, что могу написать валидатор обратного вызова, но пишуобратный вызов для каждого поля, просто чтобы иметь возможность "allowEmpty", не так хорош.

Ответы [ 6 ]

25 голосов
/ 22 сентября 2011

Вы должны явно установить 'required' => false в своем классе FormBuilder для всех необязательных полей. Вот параграф, описывающий опции типа поля .


Редактировать. Получение довольно много голосов. По умолчанию все валидаторы обрабатывают null значения как действительные, за исключением NotNull и NotEmpty. Ни один из двух не был использован в вопросе. Вопрос неявно о том, как отключить атрибут required на стороне клиента, который включен по умолчанию.

20 голосов
/ 27 февраля 2012

Установка опции required не является решением:

Также обратите внимание, что установка для обязательной опции значения true не приведет к применению проверки на стороне сервера.Другими словами, если пользователь отправляет пустое значение для поля (например, со старым браузером или веб-службой), оно будет принято в качестве допустимого значения, если вы не используете ограничение проверки Symfony NotBlank или NotNull.

http://symfony.com/doc/current/book/forms.html#field-type-options

Для моих пользовательских валидаторов я добавляю

if (null == $value) {
    return true;
}

к методу isValid().Однако я не уверен, что будет лучшим способом для стандартных классов валидаторов.

3 голосов
/ 16 марта 2015

если я правильно понимаю, вы хотите проверку на стороне сервера, только если введено значение. Я точно по тому же сценарию. Я хочу проверить URL, только если он указан. Лучший способ, с которым я столкнулся, - написать свой собственный класс валидации. Вы можете написать универсальный пользовательский класс проверки.

Я перешел по этой ссылке https://symfony -docs-chs.readthedocs.org / ru / 2.0 / cookbook / validation / custom_constraint.html за исключением нескольких изменений из-за последней версии Symfony. Вот реализация

Acme \ BundleNameBundle \ Validator \ Ограничения \ cstmUrl

namespace Acme\BundleNameBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;

/**
 * @Annotation
 */
class CstmUrl extends Url
{
    public $message = 'The URL "%string%" is not valid';
}

Acme \ BundleNameBundle \ Validator \ Ограничения \ cstmUrlValidator

namespace Acme\BundleNameBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Url;
use Symfony\Component\Validator\Constraints\UrlValidator;

class CstmUrlValidator extends UrlValidator
{
    public function validate($value, Constraint $constraint)
    {
        if(!$value || empty($value))
            return true;

        parent::validate($value, $constraint);
    }
}

Validtion.yml

Acme\BundleNameBundle\Entity\Student:
    Url:
        - Acme\BundleNameBundle\Validator\Constraints\CstmUrl: ~

внутри контроллера просто свяжите ограничение, которое вы обычно делаете

'constraints'=> new CstmUrl(array("message"=>"Invalid url provided"))

Я уверен, что могут быть и другие лучшие способы сделать это, но сейчас я чувствую, что это хорошо справляется с работой.

2 голосов
/ 30 сентября 2013

На всякий случай, если кто-то еще сталкивается с этим же вопросом.Я предпочитаю решить эту проблему лично, добавив в свой шаблон Twig следующий атрибут:

{{ form_row(form.<field>, {'required': false}) }}
1 голос
/ 24 июля 2013

Вот трюк, который я нашел на самом деле:

https://github.com/symfony/symfony/issues/5906

Вам нужно написать преобразователь данных, который ничего не делает, а затем добавить его в поле. После этого вы можете вызвать метод submit () со вторым параметром в значение false.

Обратите внимание, что с Symfony 2.3 все в порядке.

0 голосов
/ 18 марта 2014

Тип поля Догадайся с этим. http://symfony.com/doc/current/book/forms.html#field-type-guessing

Это зависит от объявления вашей формы : «Гадание» активируется, когда вы опускаете второй аргумент в методе add () (или если вы передаете ему ноль). Если вы передаете опции массив в качестве третьего аргумента (сделано для dueDate выше), эти параметры применяются к угаданному полю. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...