私は同じ問題を抱えていて、このように解決しました:
- カスタム バリデータ クラスを作成し、名前を付け
NoEntityExists
ます (または任意の名前を付けます)。
- 拡張する
Zend\Validator\AbstractValidator
- のゲッターとセッターを提供する
Doctrine\ORM\EntityManager
- オプション用の追加のゲッターとセッターを提供します (entityname など)。
isValid($value)
レコードが存在するかどうかを確認してブール値を返すメソッドを作成する
- これを使用するには、新しいインスタンスを作成し、 を割り当てて、
EntityManager
他のバリデータと同様に使用します。
バリデータ クラスを実装する方法を理解するには、既存のバリデータを確認してください (Callback
またはのような単純なものが望ましいGreaterThan
)。
お役に立てれば幸いです。
// 編集: すみません、遅れました ;-)
そのため、このようなバリデーターを実装する方法の非常に高度な例を次に示します。
translate()
PoEdit (ソース コードからそのような文字列を取得し、リストに追加する翻訳ヘルパー ツール) で言語文字列をキャッチするためのメソッドを追加したことに注意してください。を使用していない場合はgettext()
、おそらくスキップできます。
また、これは ZF2 を使用した最初のクラスの 1 つでした。これを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;
}
}