如何在symfony2验证器中允许空值

时间:2011-09-22 17:52:44

标签: php validation symfony

我想仅在值不为空时才对对象属性应用验证器,即

现在标准的symfony行为:

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

如果电子邮件为空,或者空字符串,有没有办法告诉验证者断言为有效的空值,并且仅在字段有数据时验证?

PS我知道我可以编写回调验证器,但为每个字段写回调只是为了拥有“allowEmpty”功能并不是那么好。

6 个答案:

答案 0 :(得分:26)

您必须在'required' => false课程中为所有可选字段明确设置FormBuilder。这是一段描述field type options的段落。


编辑。获得相当多的downvotes。默认情况下,所有验证器将null值视为有效, NotNullNotEmpty。这两个问题都没有用在问题中。问题隐含在如何关闭默认启用的客户端required属性。

答案 1 :(得分:20)

设置required选项不是解决方案:

  

另请注意,将required选项设置为true不会导致应用服务器端验证。换句话说,如果用户为该字段提交空白值(例如,使用旧浏览器或Web服务),除非您使用Symfony的NotBlank或NotNull验证约束,否则它将被接受为有效值。

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

对于我的自定义验证器,我添加了一个

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

isValid()方法。但是,我不确定标准验证器类的最佳方法是什么。

答案 2 :(得分:3)

如果我理解正确,只有输入值才需要服务器端验证。我正是在同一个场景中。我想仅在提供URL时才验证URL。我遇到的最好方法是编写自己的自定义验证类。您可以编写通用的自定义验证类。

我遵循此链接https://symfony-docs-chs.readthedocs.org/en/2.0/cookbook/validation/custom_constraint.html,因为symfony的最新版本除了少量更改。 这是实现

<强>的Acme \ BundleNameBundle \验证\约束\ 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 \验证\约束\ 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"))

我相信还有其他更好的方法可以做到这一点,但是现在我觉得这样做很好。

答案 3 :(得分:2)

以防万一其他人遇到同样的问题。我更喜欢通过在我的Twig模板中添加以下属性来亲自解决它:

{{ form_row(form.<field>, {'required': false}) }}

答案 4 :(得分:1)

这是我实际发现的技巧:

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

您需要编写一个不执行任何操作的数据转换器,然后将其添加到您的字段中。 之后,juste将第二个参数的submit()方法调用为false。

请注意,Symfony 2.3可以。

答案 5 :(得分:0)

Field Type Guessing处理这个问题。 http://symfony.com/doc/current/book/forms.html#field-type-guessing

这取决于您的表单声明:&#34;&#34;猜测&#34;省略add()方法的第二个参数(或者如果向其传递null)时激活。如果您将options数组作为第三个参数传递(对于上面的dueDate完成),则这些选项将应用于猜测字段。&#34;