我遇到了同样的问题并以这种方式解决了它:
- 创建一个自定义验证器类,将其命名为
NoEntityExists
(或您想要的任何名称)。
- 延长
Zend\Validator\AbstractValidator
- 为
Doctrine\ORM\EntityManager
- 为选项(实体名,...)提供一些额外的 getter 和 setter
- 创建一个
isValid($value)
检查记录是否存在并返回布尔值的方法
- 要使用它,请创建它的新实例,分配
EntityManager
并使用它,就像任何其他验证器一样。
要了解如何实现验证器类,请检查已经存在的验证器(最好是简单的类似Callback
or GreaterThan
)。
希望我能帮助你。
// 编辑:对不起,我迟到了 ;-)
所以这里有一个非常高级的例子,说明如何实现这样的验证器。
请注意,我添加了一个translate()
方法以使用 PoEdit(一种翻译帮助工具,从源代码中获取此类字符串并将它们放入列表中)来捕获语言字符串。如果您不使用gettext()
,则可能会跳过它。
此外,这是我第一次使用 ZF2 的课程之一,我不会再将它放入Application
模块中。也许,例如创建一个更适合的新模块MyDoctrineValidator
。
此验证器为您提供了很大的灵活性,因为您必须在使用之前设置查询。当然,您可以预先定义一个查询并在选项中设置实体、搜索列等。玩得开心!
<?php
namespace Application\Validator\Doctrine;
use Zend\Validator\AbstractValidator;
use Doctrine\ORM\EntityManager;
class NoEntityExists extends AbstractValidator
{
const ENTITY_FOUND = 'entityFound';
protected $messageTemplates = array();
/**
* @var EntityManager
*/
protected $entityManager;
/**
* @param string
*/
protected $query;
/**
* Determines if empty values (null, empty string) will <b>NOT</b> be included in the check.
* Defaults to true
* @var bool
*/
protected $ignoreEmpty = true;
/**
* Dummy to catch messages with PoEdit...
* @param string $msg
* @return string
*/
public function translate($msg)
{
return $msg;
}
/**
* @return the $ignoreEmpty
*/
public function getIgnoreEmpty()
{
return $this->ignoreEmpty;
}
/**
* @param boolean $ignoreEmpty
*/
public function setIgnoreEmpty($ignoreEmpty)
{
$this->ignoreEmpty = $ignoreEmpty;
return $this;
}
/**
*
* @param unknown_type $entityManager
* @param unknown_type $query
*/
public function __construct($entityManager = null, $query = null, $options = null)
{
if(null !== $entityManager)
$this->setEntityManager($entityManager);
if(null !== $query)
$this->setQuery($query);
// Init messages
$this->messageTemplates[self::ENTITY_FOUND] = $this->translate('There is already an entity with this value.');
return parent::__construct($options);
}
/**
*
* @param EntityManager $entityManager
* @return \Application\Validator\Doctrine\NoEntityExists
*/
public function setEntityManager(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
return $this;
}
/**
* @return the $query
*/
public function getQuery()
{
return $this->query;
}
/**
* @param field_type $query
*/
public function setQuery($query)
{
$this->query = $query;
return $this;
}
/**
* @return \Doctrine\ORM\EntityManager
*/
public function getEntityManager()
{
return $this->entityManager;
}
/**
* (non-PHPdoc)
* @see \Zend\Validator\ValidatorInterface::isValid()
* @throws Exception\RuntimeException() in case EntityManager or query is missing
*/
public function isValid($value)
{
// Fetch entityManager
$em = $this->getEntityManager();
if(null === $em)
throw new Exception\RuntimeException(__METHOD__ . ' There is no entityManager set.');
// Fetch query
$query = $this->getQuery();
if(null === $query)
throw new Exception\RuntimeException(__METHOD__ . ' There is no query set.');
// Ignore empty values?
if((null === $value || '' === $value) && $this->getIgnoreEmpty())
return true;
$queryObj = $em->createQuery($query)->setMaxResults(1);
$entitiesFound = !! count($queryObj->execute(array(':value' => $value)));
// Set Error message
if($entitiesFound)
$this->error(self::ENTITY_FOUND);
// Valid if no records are found -> result count is 0
return ! $entitiesFound;
}
}