Symfony验证组件多维表单数据

时间:2017-10-13 08:53:01

标签: symfony validation

我有一个表单,其中包含允许您通过单击添加其他用户按钮添加多个用户信息的字段。

在服务器端,我想根据需要验证所有名字和姓氏。

我的问题是我不知道如何验证重复数据,如fname和lname就在这里。

$stripToken = $request->request->get('stripeToken');

        $input = $request->request->all();
        var_dump($input);
        try {
            $constraint = new Assert\Collection(array(
                'fields' => array(
                    'guest_fname' => new Assert\All(array(
                        'constraints' => array(
                            new Assert\NotBlank(),
                            new Assert\MinLength(array('limit' => 2))
                        )
                    )),
                    'guest_lname' => new Assert\All(array(
                        'constraints' => array(
                            new Assert\NotBlank(),
                            new Assert\MinLength(array('limit' => 2))
                        )
                    ))
                ),
                'allowMissingFields' => true,
            ));
        }catch (\Exception $e) {
            return $e->getMessage();
        }

        $errors = $this->app['validator']->validate($input, $constraint);

此代码无效。输入的var_dump返回

array(6) {
  ["guest_fname"]=>
  array(3) {
    [0]=>
    string(3) "asdd"
    [1]=>
    string(6) "asdasd"
    [2]=>
    string(9) "asdasdasd"
  }
  ["guest_lname"]=>
  array(3) {
    [0]=>
    string(6) "asdasd"
    [1]=>
    string(6) "asdasd"
    [2]=>
    string(9) "asdasdasd"
  }
  ["guest_email"]=>
  array(1) {
    [0]=>
    string(0) ""
  }
  ["guest_phone"]=>
  array(1) {
    [0]=>
    string(0) ""
  }
  ["guest_count"]=>
  string(1) "1"
  ["stripeToken"]=>
  string(28) "tok_234234234234234"
}

2 个答案:

答案 0 :(得分:0)

您将Assert\All()包裹在Assert\Collection()内,而Assert\All()就足够了。

您的$input 一个集合(可迭代),但是一个包含键/值对的数组。只需验证它自己的每个密钥。

$constraint = new Assert\All(array(
    'constraints' => array(
        new Assert\NotBlank(),
        new Assert\Length(array('min' => 5)),
    ),
);
$errors = $this->app['validator']->validate($input['guest_fname'], $constraint);

...或者可以$input用可迭代(即数组)包裹起来,然后将其传递给验证程序并继续使用您的包装Assert\Collection()

$errors = $this->app['validator']->validate(array($input), $constraint);

答案 1 :(得分:0)

结果是该组件的较新版本的断言选项列表没有MinLength选项。相反,选项是长度。这是解决此问题的约束代码。

public Flowable<AccountResponse> auth(String login, String password) {
        return checkUsername(login)
            .flatMap(checkUsernameResponse -> {
                // do whatever checking you want to do here, e.g.:
                if (!checkUsernameResponse.isUsernameOk()) {
                    throw new RuntimeException("Access not granted."));
                }
                // First call succeeded, proceed to the second one:
                return restService.auth(login, password);
            })
            .doOnNext(loginResponse -> {
                tokenManager.saveToken(loginResponse.getToken());
            });
        }

剩下的代码很好。