Symfony2 自定义验证,具有数据库连接但没有实体


Symfony2 Custom Validation with DB connection but no Entity

我只是尝试使用一个字段"用户名"验证表单(未附加实体)。我想检查用户名是否存在。如果没有,则必须在表单错误级别(或表单字段错误级别,我不太在乎)显示正确的消息。

这是我的控制器的相关部分:

$formGlobalSearch=$this->createFormBuilder()
->add('username', 'text', array('constraints' => new UsernameExists()))
->add('role', 'choice', array('choices' => $rolesListForForm,'required' => false, 'placeholder' => 'Choose a role', 'label' => false, ))
->add('submitUsername', 'submit', array('label' => 'Search username globally'))
->getForm();
$formGlobalSearch->handleRequest($request);
if ($formGlobalSearch->isValid())
    {
    // do something in the DB and refresh current page
    }
return $this->render(//all the stuff needed to render my page//);
}

这是service.yml的相关部分

validator.unique.UsernameExists:
    class: AppBundle'Validator'Constraints'UsernameExists
    tags:
        - { name: validator.constraint_validator, alias: UsernameExists }

下面是验证器类:

使用 Symfony''Component''Validator''Constraint;

/**
 * @Annotation
 */
class UsernameExists extends Constraint
{
public $message = 'The username "%string%" does not exist.';
public function validatedBy()
{
    return 'UsernameExists';
}
}

这是验证器:

<?php
namespace AppBundle'Validator'Constraints;
use Symfony'Component'Validator'Constraint;
use Symfony'Component'Validator'ConstraintValidator;
class UsernameExistsValidator extends ConstraintValidator
{
public function validate($value)
    {
    $globalUserToAdd = $this->getDoctrine()->getRepository('AppBundle:User')->findOneBy(
        array('username' => $value, 'enabled' => true)
        );
    if ($globalUserToAdd == null) //I did not find the user
        {
        $this->context->buildViolation($constraint->message)
            ->setParameter('%string%', $value)
            ->addViolation();
        }
    }
}

类和验证器位于目录"AppBundle''Validator''Constraint"

我收到以下错误:

类型的预期参数 "Symfony''Component''Validator''ConstraintValidatorInterface", 给定"AppBundle''Validator''Constraint''UsernameExists"

当然,我的控制器顶部有以下内容:

use AppBundle'Validator'Constraints'UsernameExists;

如果我将以下内容添加到服务.yml

arguments: ["string"]

我收到错误:

没有为约束配置默认选项 AppBundle''Validator''Constraint''UsernameExists

尝试更改:

public function validatedBy()
{
    return 'UsernameExists';
}
validator.unique.UsernameExists:
    class: AppBundle'Validator'Constraints'UsernameExists

自:

public function validatedBy()
{
    return 'UsernameExistsValidator';
}
validator.unique.UsernameExists:
    class: AppBundle'Validator'Constraints'UsernameExistsValidator

合并(部分)建议并在此处进行更多调试是最终代码。

验证人:

<?php
namespace AppBundle'Validator'Constraints;
use Symfony'Component'Validator'Constraint;
use Symfony'Component'Validator'ConstraintValidator;
use Doctrine'ORM'EntityManager;
class UsernameExistsValidator extends ConstraintValidator
{
public function __construct(EntityManager $em) //added
{
    $this->em = $em;
}
public function validate($value, Constraint $constraint)
    {
    $em = $this->em;
    $globalUserToAdd = $em->getRepository('AppBundle:User')->findOneBy(
        array('username' => $value, 'enabled' => true)
        );
    if ($globalUserToAdd == null) //I did not find the user
        {
        $this->context->buildViolation($constraint->message)
            ->setParameter('%string%', $value)
            ->addViolation();
        }
    }
}

服务.yml

validator.unique.UsernameExists:
    class: AppBundle'Validator'Constraints'UsernameExistsValidator
    arguments: [ @doctrine.orm.entity_manager, "string"]
    tags:
        - { name: validator.constraint_validator, alias: UsernameExists }