我想仅在值不为空时才对对象属性应用验证器,即
现在标准的symfony行为:
class Entity
{
/**
* @ORM\Column(type="string", nullable=true)
* @Assert\Email()
*/
protected $email;
(...)
}
如果电子邮件为空,或者空字符串,有没有办法告诉验证者断言为有效的空值,并且仅在字段有数据时验证?
PS我知道我可以编写回调验证器,但为每个字段写回调只是为了拥有“allowEmpty”功能并不是那么好。
答案 0 :(得分:26)
您必须在'required' => false
课程中为所有可选字段明确设置FormBuilder
。这是一段描述field type options的段落。
编辑。获得相当多的downvotes。默认情况下,所有验证器将null
值视为有效,除 NotNull
和NotEmpty
。这两个问题都没有用在问题中。问题隐含在如何关闭默认启用的客户端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;