没有为约束配置默认选项

时间:2014-04-06 18:07:32

标签: symfony

我按照symfony 2的文档编写自己的约束(傻简单)但是在运行之后我有这个错误:

No default option is configured for constraint Cgboard\SignupBundle\Validator\Constraints\PasswordNotMatching

我在stackoverflow的另一篇文章中看到了一个使用服务的解决方案,但是我不确定该解决方案是否最好,在文档中没有出现关于这个简单示例的任何服务。< / p>

稍微调试一下,我终于看到从未调用过buildform()方法。为什么呢?

我的validation.yml

Cgboard\SignupBundle\Entity\SignupData:
  properties:
    email:
      - NotBlank: ~
    nickname:
      - NotBlank: ~
    password:
      - NotBlank: ~
    password_repeat:
      - NotBlank: ~
      - Cgboard\SignupBundle\Validator\Constraints\PasswordNotMatching: ~;

我的验证员:

<?php
namespace Cgboard\SignupBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class PasswordNotMatchingValidator extends ConstraintValidator
{
    public function validate($DataForm, Constraint $constraint)
    {
        return false;
    }
} 

我的约束:

<?php
namespace Cgboard\SignupBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class PasswordNotMatching  extends Constraint
{
    public $message = 'The password doesnt match';

}

我的控制器就是这个:

<?php
namespace Cgboard\SignupBundle\Controller\Frontend;

use     Symfony\Component\HttpFoundation\Request;
use     Symfony\Bundle\FrameworkBundle\Controller\Controller;
use     Cgboard\SignupBundle\Entity\User;


class SignupController extends Controller
{
    public $SignupData;

    public function indexAction(Request $request)
    {
        $SignupData = $this->getSignupData();
        $SignupForm = $this->getSignupForm();
        $form       = $this->createForm($SignupForm, $SignupData);

        if($request->getMethod() === 'POST') {
            $form->bind($request);
            if($form->isValid()) {
                $this->save($SignupData);
            }
        }

        return $this->render(
                                'CgboardSignupBundle:Frontend:signup.html.twig',
                                array('form'=>$form->createView())
        );
    }

    public function save(\Cgboard\SignupBundle\Entity\SignupData $SignupData)
    {
        // something

    }

    public function getSignupData()
    {
        return new \Cgboard\SignupBundle\Entity\SignupData();
    }

    public function getSignupForm()
    {
        return new \Cgboard\SignupBundle\Forms\Frontend\SignupForm();


    }

} 

我的表格是:

<?php
namespace Cgboard\SignupBundle\Forms\Frontend;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;


class SignupForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        die('im here');                        // never is called, why??
        $builder->add('email');
        $builder->add('nickname');
        $builder->add('password');
        $builder->add('password_repeat');
    }

    public function getName()
    {
        return 'signup_form';
    }
} 

我正在调试,我发现方法buildform()不会被调用。为什么?

2 个答案:

答案 0 :(得分:2)

对于任何会看到此线程并使用XML而不是YAML的人来说,这也可能是同一错误消息的可能解决方案:

这不起作用:

<getter property="fieldname">
    <constraint name="Test\TestBundle\Validator\Constraints\Test">
    </constraint>
</getter>

但这会奏效:

<getter property="fieldname">
    <constraint name="Test\TestBundle\Validator\Constraints\Test" />
</getter>

答案 1 :(得分:0)

您应该在~中使用~;代替validation.yml

Cgboard\SignupBundle\Entity\SignupData:
  properties:
    email:
      - NotBlank: ~
    nickname:
      - NotBlank: ~
    password:
      - NotBlank: ~
    password_repeat:
      - NotBlank: ~
      - Cgboard\SignupBundle\Validator\Constraints\PasswordNotMatching: ~

Cgboard\SignupBundle\Validator\Constraints\PasswordNotMatching: ~;表示与...: ~不同的内容。 ~运算符在Yaml中表示null。在执行: ~时,您可以使用null(无)进行配置。但是在执行~;时,您使用字符串"~;"配置它。

有两种方法可以为约束配置选项:使用数组:

Choice:
  choices: [red, blue]

但是一些约束有一个&#34;默认选项&#34;。对于Choice约束,choices是默认选项。这意味着上述内容可以按如下方式完成:

Choice: [red, blue]

现在,[red, blue]将设置为choices选项。

在您的情况下,您定义了值"~;"。由于这不是null,因此它尝试将其设置为默认选项。但是约束没有配置默认选项,因此Symfony失败了。使用~时,null和Symfony不会设置任何选项。