FormValidator,是Symfony中最大的组件之一。在Symfony 2.7中,我们改进了它们,通过功能添加和功能移除。

为URL验证添加了checksDNS选项 

Url约束用来验证给定的值是一个有效的链接字符串。在Symfony 2.7中,新增了checkDNS选项,可以检查URL中的host是否有效:

1
2
3
4
5
6
7
8
9
10
11
namespace AppBundle\Entity;
 
use Symfony\Component\Validator\Constraints as Assert;
 
class Website
{
    /**
     * @Assert\Url(checkDNS = true)
     */
     protected $url;
}

这个选项在内部执行了下述代码:

1
2
3
4
$host = parse_url($value, PHP_URL_HOST);
if (!checkdnsrr($host, 'ANY')) {
    // ... error
}

重命名precision选项为scale 

Number字段类型precision选项是一个区域限定的设置,指定提交过来的值应保留多少个小数位。在Symfony 2.7中,这个选项被重命名为scale

1
2
3
4
5
// Symfony 2.6
$builder->add('length', 'number', array('precision' => 3));
 
// Symfony 2.7
$builder->add('length', 'number', array('scale' => 3));

弱化setDefaultOptions()并以configureOptions() 

在Symfony 2.7中,abstractType()setDefaultOptions()方法,以及abstractExtensionType()将不建议使用。改以全新的configureOptions()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Symfony 2.6
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
class TaskType extends AbstractType
{
    // ...
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Task',
        ));
    }
}
 
// Symfony 2.7
use Symfony\Component\OptionsResolver\OptionsResolver;
 
class TaskType extends AbstractType
{
    // ...
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Task',
        ));
    }
}

添加对从子目录中导入验证约束的支持 

如果你的bundles中包含了大量entities或documents,而你只想用YAML或XML格式来定义它们的验证,而不是用annotations,这可能导致验证文件过大而难以管理。

Symfony 2.7添加了对从你bundles中的Resource/config/validation子目录中加载任意数量的validation验证文件的支持。

your-bundle/
├── ...
└── Resources/
    └── config/
         └── validation
              ├── Author.yml
              ├── Category.yml
              ├── Comment.yml
              └── Post.yml

添加choice_translation_domain以避免翻译选项 

在Symfony 2.7中,translator组件默认对Doctrine类型entity的翻译功能进行了关闭,这将导致显著的性能提升。显式地开启这个功能,可通过设置全新的choice_translation_domain选项为true来实现:

1
2
3
4
5
6
7
8
9
10
// Symfony 2.6
$form->add('products', 'entity', array(
    'class' => 'AppBundle/Entity/Product',
));
 
// Symfony 2.7
$form->add('products', 'entity', array(
    'class' => 'AppBundle/Entity/Product',
    'choice_translation_domain' => true,
));

choice_translation_domain选项的值可为true(复用当前translation domain)、false(关闭翻译功能)、null(使用父级translation domain或默认domain)或指定使用一个明确的translation domain的字符串。