我现在得到自己越来越熟悉Zend框架2并在此期间我正在自己与Zend框架的验证部分2.我所看到的几个例子如何从使用Zend数据库适配器数据库验证数据更新,例如,从Zend框架2官方网站的代码:
//Check that the username is not present in the database
$validator = new Zend\Validator\Db\NoRecordExists(
array(
'table' => 'users',
'field' => 'username'
)
);
if ($validator->isValid($username)) {
// username appears to be valid
} else {
// username is invalid; print the reason
$messages = $validator->getMessages();
foreach ($messages as $message) {
echo "$message\n";
}
}
现在的问题是怎么做验证的一部分?
例如,我需要插入到数据库之前验证一个名称来检查相同名称不存在于数据库中,我已经更新了Zend框架2例如相册模块使用Doctrine 2与数据库进行沟通,现在我想验证部件添加到我的代码。
让我们将专辑名称我想验证相同的专辑名称不存在于数据库中的数据库之前说。
任何有关这些信息将是非常有益的!
我有同样的问题,解决这样说:
- 创建一个自定义的验证器类,将其命名为类似
NoEntityExists
(或任何你想要的)。 - 扩展
Zend\Validator\AbstractValidator
- 提供了一个getter和setter
Doctrine\ORM\EntityManager
- 提供选项一些额外的getter和setter方法(实体名称,...)
- 创建
isValid($value)
来检查,如果一个记录存在,并返回一个布尔值方法 - 要使用它,创造它的一个新实例,指定
EntityManager
并使用它就像任何其他的验证。
要获得如何实现验证器类,检查已存在的验证器(最好是一个简单的像一个想法Callback
或GreaterThan
)。
希望我可以帮助你。
//编辑:对不起,我迟到了;-)
因此,这里是你如何实现这种验证一个相当高级的例子。
请注意,我添加了一个translate()
为了赶上语言字符串与PoEdit软件(翻译辅助工具,可以从源代码中提取这样的字符串,并将它们放入一个列表供您)方法。 如果你没有使用gettext()
您可以problably跳过。
此外,这是我第一次班之一,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;
}
}
如果使用DoctrineModule,已经有一个为你的情况验证 。