Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在symfony2验证程序中允许空值_Php_Validation_Symfony - Fatal编程技术网

Php 如何在symfony2验证程序中允许空值

Php 如何在symfony2验证程序中允许空值,php,validation,symfony,Php,Validation,Symfony,我希望仅当值不为空时才对对象属性应用验证器 现在,标准symfony行为: class Entity { /** * @ORM\Column(type="string", nullable=true) * @Assert\Email() */ protected $email; (...) } 若电子邮件为null或空字符串,那个么该对象将不会通过验证。是否有方法告诉验证器断言为有效的空值,并且仅当字段有数据时才进行验证 PS我知道我可以编

我希望仅当值不为空时才对对象属性应用验证器

现在,标准symfony行为:

class Entity
{
    /**
     * @ORM\Column(type="string", nullable=true)
     * @Assert\Email()
     */
    protected $email;
    (...)
}
若电子邮件为null或空字符串,那个么该对象将不会通过验证。是否有方法告诉验证器断言为有效的空值,并且仅当字段有数据时才进行验证


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

您必须在
FormBuilder
类中为所有可选字段显式设置
'required'=>false
。这里有一段描述



编辑。获得了不少反对票。默认情况下,除了
NotNull
NotEmpty
之外,所有验证器都将
null
值视为有效值。这两个词都没有用在问题中。问题是如何关闭默认情况下打开的客户端
required
属性。

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

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

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

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

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

以下是我发现的技巧:

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


请注意,Symfony 2.3没有问题。

以防其他人遇到同样的问题。我个人更喜欢通过在我的小树枝模板中添加以下属性来解决这个问题:

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

字段类型猜测处理此问题。


这取决于您的表单声明。:“当您省略add()方法的第二个参数时(或者如果您将null传递给它),“猜测”被激活。如果您将一个选项数组作为第三个参数传递(针对上面的dueDate完成),这些选项将应用于猜测字段。”

如果我理解正确,您只希望在输入值时进行服务器端验证。我的情况也完全一样。我只想在提供URL时验证URL。我遇到的最好的方法是编写自己的自定义验证类。您可以编写一个通用的自定义验证类

除了因symfony的最新版本而进行的一些更改外,我一直关注此链接。 下面是实现

Acme\BundleNameBundle\Validator\Constraints\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\Entity\Student:
    Url:
        - Acme\BundleNameBundle\Validator\Constraints\CstmUrl: ~
Acme\BundleNameBundle\Validator\Constraints\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

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\Entity\Student:
    Url:
        - Acme\BundleNameBundle\Validator\Constraints\CstmUrl: ~
控制器内部只需绑定您通常会执行的约束

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

我相信还有其他更好的方法可以做到这一点,但目前我觉得这项工作做得很好。

这不是正确的答案。”“必需”选项仅强制客户端验证。@TyrionLannister您确实是正确的。但是,除非具有
NotNull()
NotEmpty()
约束,否则默认验证器都不会导致空值被视为无效。鉴于询问者没有这两个约束条件,这暗示了问题出在客户端HTML5
required
属性上。@gilden恕我直言,
required
属性与批准的空值没有任何共同之处。它仅用于HTML5客户端验证,与验证(服务器端验证)完全无关。@AndrzejOśmiałowski绝对正确,请检查您上面的评论。这正是我所说的:)如果他根本不知道实现它的正确方法是设置NotNull或NotEmpty约束,该怎么办?我发现这个解释很可笑。即使如此,我相信他会后悔当他试图用JSON格式的数据通过XHR发送表单数据时犯了多少错误,表单将被传递,而您将一无所获。这正是我现在面临的问题。这只是某种程度上的答案,不是完整的答案。我认为您不想在模板中硬编码。如果您想使用
required
方法,请使用gilden的建议,并将其添加到表单生成器中。是的,在大多数情况下,我认为这是一种更好的方法(这样属性验证要求可以在其他模板中传播),但在某些情况下(即简单的应用程序)将其放入细枝模板并不可怕:)这应该是可接受的答案,因为可接受的答案只适用于简单字段,而不适用于嵌入类型字段