我已将实体设置为具有生命周期回调,用于模拟mySQL中的ENUM字段进行验证。
它运行良好,只是当抛出错误时,它不提供属性名称,因此与来自Assert的错误的格式不匹配。
在下面的例子中,第一个错误来自回调,没有关于属性的信息,而其余的错误由Assert生成,并包括有问题的属性:
UsedBundle\AdController
$errors = $this->form_errors->getErrorMessages($form);
DoctrineCommonUtilDebug::dump($errors);
array(3){[0]=>string(14)"无效门!"["powerHp"]=>array(1){[0]=>string(32)"此值应为50或更大。">
由于消息的原因,我可以知道错误来自哪里,但这也会抛出生成错误变量以输出给用户的函数。
设置如下:
UsedBundle\实体\广告
namespace UsedBundleEntity;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
use GedmoMappingAnnotation as Gedmo;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentValidatorContextExecutionContextInterface;
use SymfonyComponentValidatorMappingClassMetadata;
/**
* @ORMEntity(repositoryClass="UsedBundleRepositoryAdRepository")
* @ORMHasLifecycleCallbacks
* @ORMTable(name="ads")
*/
class Ad
{
/**
* @var integer
*
* @ORMId
* @ORMColumn(type="smallint",length=4,unique=true,options={"unsigned":true})
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
......
public static $valid_doors = array(
'2' => '2',
'3' => '3',
'4' => '4',
'5' => '5',
);
/**
* @AssertCallback
*/
public function validate(ExecutionContextInterface $context, $payload)
{
if (!in_array($this->getdoors(), self::$valid_doors)) {
$context->buildViolation('Invalid doors!')
->atPath('doors')
->addViolation();
}
}
}
在您的情况下(当然,如果您的Symfony版本不早于2.4),我可以建议使用静态验证功能。当你使用静态函数时,你必须传递$object!
/**
* @static validate
*
* @param $object
* @param ExecutionContextInterface $context
*/
public static function validate($object, ExecutionContextInterface $context)
{
if (!in_array($object->getdoors(), self::$valid_doors)) {
$context->buildViolation('Invalid doors!')
->atPath('doors')
->addViolation();
}
}
正如您所看到的,没有注释/** @AssertCallback */
!此外,不必编写类注释@ORMHasLifecycleCallbacks
。希望它能有所帮助!
此外,这是Symfony官方文档的链接