Symfony 3动态验证嵌入式实体

时间:2017-12-04 21:14:39

标签: php symfony validation

我正在用symfony 3编写几个表单。我的表单非常类似于symfony引用中的给定示例:

http://symfony.com/doc/current/reference/constraints/Valid.html 我还有一个用户和一个嵌入式地址实体。我的配置是通过yml:

完成的

父母用户:

// src/Entity/User.php
namespace App\Entity;

class User
{
    protected $firstName;
    protected $lastName;
    protected $address;

    protected $mailOptIn;
}

儿童地址:

// src/Entity/Address.php
namespace App\Entity;

class Address
{
    protected $street;
    protected $zipCode;
}

YML:

# config/validator/validation.yaml
App\Entity\Address:
    properties:
        street:
            - NotBlank:  { groups: [group01, group02] }
        zipCode:
            - NotBlank:  { groups: [group01, group02] }
            - Length: { min: 3, groups: [group01, group02] }

App\Entity\User:
    properties:
        firstName:
            - NotBlank: ~
            - Length:
                min: 4
        lastName:
            - NotBlank: ~
        address:
            - Valid: { groups: [group01, group02] }

但在某些情况下(取决于父用户实体中的其他字段),它是 没有必要验证嵌入的地址实体。

现在我已经阅读了很多关于回调和getter-validators的内容,但我的问题是,我不知道,如何处理这个问题。使我的情况更加复杂的另一个部分是,我需要在地址实体中使用验证组(https://symfony.com/doc/current/form/validation_groups.html),因为我验证了大约20个国家,每个国家都有它自己的验证字段。

任何人都可以给我提示,如何继续?与组的地址验证工作完美,我想我只需要在父用户实体中实现一些很酷的神奇东西,对吗?

UPDATE:

我刚刚添加了两件事:

    类USER中的
  • - > protected $ mailOptIn
  • 在YML-User中 - >地址: - 有效期:{groups:[group01,group02]}

使用有效密钥进行验证。

我现在想要实现的是,只有在用户将mailOptIn设置为true时才进行地址验证,因为只有在这种情况下,我需要地址。 请注意,我确实需要用于地址验证的组,具体取决于给定地址所在的国家/地区。

3 个答案:

答案 0 :(得分:1)

我的解决方案是,使用MULTIPLE' validation_groups'和我的表单类中的回调函数。 我不知道每个表单可以使用多个组。

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults($this->addDefaults([
        'data_class' => ContactGeneral::class,
        'cascade_validation' => true,
    ]));

    $resolver->setDefaults([
        'validation_groups' => function (FormInterface $form) {
            $data = $form->getData();
            if ($data->getAddress()->isValidate()) {
                return ['ContactGeneral', 'User', 'contactUser', 'Address', $this->alsLm->getGroupName()];
            } else {
                return ['ContactGeneral', 'User', 'contactUser', 'Address'];
            }
        },
    ]);
}

请参阅:

答案 1 :(得分:0)

在这种情况下,文档可能不太清楚,但您必须在其上添加Valid: ~键,例如:

App\Entity\User:
properties:
    firstName:
        - NotBlank: ~
        - Length:
            min: 4
    lastName:
        - NotBlank: ~
    address:
        - Valid: ~

答案 2 :(得分:0)

您可以在控制器操作中执行此操作:

use Symfony\Component\Form\FormError;

class MyClass {

    public function createAction(Request $request) {
        // your actual code

        // dynamic form validation
        if($form->isSubmitted()){
            $zip= $form->get('address')->get('zip')->getData();
            $street= $form->get('address')->get('street')->getData();
            if($zip == '1234' && count($street)>150){
                 $form->get('address')->get('zip')->addError(new FormError('Address cant have more than 150 char for ZIP 1234')); // add error on the ZIP field
            } else if($zip == '465' && count($street) < 3) {
                 $form->get('address')->get('street')->addError(new FormError('Address must have more than 3 char for ZIP 456')); // add error on the address field
            }
        }

        // your actual code
        if($form->isSubmitted() && $form->isValid()){

        }
    }
}