[英]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 \\ Constraints”中
我收到以下錯誤:
給定類型為“ Symfony \\ Component \\ Validator \\ ConstraintValidatorInterface”,“ AppBundle \\ Validator \\ Constraints \\ UsernameExists”的預期參數
我當然在控制器上有以下內容:
use AppBundle\Validator\Constraints\UsernameExists;
如果我將以下內容添加到service.yml
arguments: ["string"]
我得到錯誤:
沒有為約束AppBundle \\ Validator \\ Constraints \\ 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();
}
}
}
service.yml
validator.unique.UsernameExists:
class: AppBundle\Validator\Constraints\UsernameExistsValidator
arguments: [ @doctrine.orm.entity_manager, "string"]
tags:
- { name: validator.constraint_validator, alias: UsernameExists }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.