3

我现在越来越熟悉 Zend Framework 2,同时我也在更新 Zend Framework 2 中的验证部分。我见过几个例子,如何使用 Zend Db 适配器验证数据库中的数据,例如来自 Zend Framework 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 Framework 2 示例专辑模块以使用 Doctrine 2 与数据库进行通信,现在我想将验证部分添加到我的代码中。

假设在将专辑名称添加到数据库之前,我想验证数据库中不存在相同的专辑名称。

任何有关此的信息都会非常有帮助!

4

2 回答 2

5

如果您使用 DoctrineModule,则您的案例已经有一个验证器

于 2012-09-07T09:27:15.893 回答
2

我遇到了同样的问题并以这种方式解决了它:

  1. 创建一个自定义验证器类,将其命名为NoEntityExists(或您想要的任何名称)。
  2. 延长Zend\Validator\AbstractValidator
  3. Doctrine\ORM\EntityManager
  4. 为选项(实体名,...)提供一些额外的 getter 和 setter
  5. 创建一个isValid($value)检查记录是否存在并返回布尔值的方法
  6. 要使用它,请创建它的新实例,分配EntityManager并使用它,就像任何其他验证器一样。

要了解如何实现验证器类,请检查已经存在的验证器(最好是简单的类似Callbackor 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;
    }
}
于 2012-09-06T13:59:19.850 回答