Php Symfony 3中的自定义验证器约束

Php Symfony 3中的自定义验证器约束,php,symfony,Php,Symfony,我正在尝试在symfony3中创建一个自定义验证器约束 当然,我遵循了文档结尾,结尾是: #AppBundle\Validator\Constraint\Device.php namespace AppBundle\Validator\Constraint; /** * @Annotation */ class Device extends \Symfony\Component\Validator\Constraint { public $message = 'Device "%d

我正在尝试在symfony3中创建一个自定义验证器约束

当然,我遵循了文档结尾,结尾是:

#AppBundle\Validator\Constraint\Device.php

namespace AppBundle\Validator\Constraint;
/**
 * @Annotation
 */
class Device extends \Symfony\Component\Validator\Constraint
{
    public $message = 'Device "%device%" is not valid';
    public $shortMessage = 'Device ID is too short';
    public $chunkMessage = 'Device ID doesn\'t have a correct number of parts';
 }
约束

#AppBundle\Validator\DeviceValidator.php
namespace AppBundle\Validator;

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

class DeviceValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint) : void
{
    if (!$myconstraint) {
        //A lot of code here
        $this->context->buildViolation($constraint->shortMessage)->addViolation();
    }
}
}
和表单类型

#AppBundle\Form\Type\LoginType.php

namespace AppBundle\Form\Type;

use AppBundle\Validator\Constraint\Device;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;

class LoginType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('username', TextType::class, ['required' => true, 'constraints' => [new Length(['min' => 3, 'minMessage' => 'Username is too short'])]])
        ->add('password', TextType::class, ['required' => true, 'constraints' => [new Length(['min' => 3, 'minMessage' => 'Password is too short'])]])
        ->add('device', TextType::class, ['required' => true, 'constraints' => [new Device()]]);
}
}
表单是这样创建的:

$loginForm = Forms::createFormFactoryBuilder()->addExtension(new HttpFoundationExtension())->getFormFactory()->create(LoginType::class);
但无论我做什么,我都得到了这样的回应:

{ “代码”:500, “消息”:“选项”“约束”“不存在。定义的选项有:\'action\'、\'attr\'、\'auto\'u initialize\'、\'block\'u name\'、\'by\'u reference\'、\'component\'、\'data\'、\'data\'class\'、\'disabled\'、\'empty\'data\'、\'error\'u冒泡'、\'inherit\'u data\'、'label\'、'label\'、'u attr\'、'label\'u format'、'post\U max\U size\U message\”、“property\U path\”、“required\”、“translation\U domain\”、“trim\”、“upload\U max\U size\U message\” }

根据doc的说法,“约束”是允许放在我放的地方的,我真的不知道Symfony为什么在这里哭

有什么想法吗?
非常感谢。

AppBundle\Validator\Constraint\Device.php中的名称空间不太正确。删除尾部的“约束”:


我想你错过了分机

use Symfony\Component\Validator\Validation;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
$validator = Validation::createValidator();

$formFactory = Forms::createFormFactoryBuilder()
    ->addExtension(new HttpFoundationExtension())
    ->addExtension(new ValidatorExtension($validator))
    ->getFormFactory()
    ->create(LoginType::class);
“此选项(约束)添加到FormTypeValidatorExtension表单扩展中。”
use Symfony\Component\Validator\Validation;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
$validator = Validation::createValidator();

$formFactory = Forms::createFormFactoryBuilder()
    ->addExtension(new HttpFoundationExtension())
    ->addExtension(new ValidatorExtension($validator))
    ->getFormFactory()
    ->create(LoginType::class);