我按照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()不会被调用。为什么?
答案 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不会设置任何选项。