繁体   English   中英

使用Doctrine 2在Zend Framework 2中进行验证

[英]Validation in Zend Framework 2 with Doctrine 2

我现在正越来越熟悉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与数据库进行通信,而现在我想要将验证部分添加到我的代码中。

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

任何有关这方面的信息都会非常有用!

如果你使用DoctrineModule,那么你的案例已经有了验证器

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

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

要了解如何实现验证器类,请检查已存在的验证器(最好是一个简单的验证器,如CallbackGreaterThan )。

希望我能帮助你。

//编辑:抱歉,我迟到了;-)

所以这是一个非常先进的例子,说明如何实现这样的验证器。

请注意,我添加了一个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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM