简体   繁体   English

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

[英]Validation in Zend Framework 2 with Doctrine 2

I am right now getting myself more and more familiar with Zend Framework 2 and in the meantime I was getting myself updated with the validation part in Zend Framework 2. I have seen few examples how to validate the data from the database using Zend Db adapter, for example the code from the Zend Framework 2 official website: 我现在正越来越熟悉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";
    }
}

Now my question is how can do the validation part? 现在我的问题是如何做验证部分?

For example, I need to validate a name before inserting into database to check that the same name does not exist in the database, I have updated Zend Framework 2 example Album module to use Doctrine 2 to communicate with the database and right now I want to add the validation part to my code. 例如,我需要在插入数据库之前验证一个名称以检查数据库中是否存在相同的名称,我已经更新了Zend Framework 2示例相册模块以使用Doctrine 2与数据库进行通信,而现在我想要将验证部分添加到我的代码中。

Let us say that before adding the album name to the database I want to validate that the same album name does not exist in the database. 让我们说在将数据库名称添加到数据库之前,我想验证数据库中不存在相同的专辑名称。

Any information regarding this would be really helpful! 任何有关这方面的信息都会非常有用!

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

I had the same problem and solved it this way: 我有同样的问题并以这种方式解决了它:

  1. Create a custom validator class, name it something like NoEntityExists (or whatever you want). 创建一个自定义验证器类,将其命名为NoEntityExists (或任何您想要的)。
  2. Extend Zend\\Validator\\AbstractValidator 扩展Zend\\Validator\\AbstractValidator
  3. Provide a getter and setter for Doctrine\\ORM\\EntityManager Doctrine\\ORM\\EntityManager提供getter和setter
  4. Provide some extra getters and setters for options (entityname, ...) 为选项提供一些额外的getter和setter(entityname,...)
  5. Create an isValid($value) method that checks if a record exists and returns a boolean 创建一个isValid($value)方法,用于检查记录是否存在并返回布尔值
  6. To use it, create a new instance of it, assign the EntityManager and use it just like any other validator. 要使用它,请创建它的新实例,分配EntityManager并像使用任何其他验证器一样使用它。

To get an idea of how to implement the validator class, check the validators that already exist (preferably a simple one like Callback or GreaterThan ). 要了解如何实现验证器类,请检查已存在的验证器(最好是一个简单的验证器,如CallbackGreaterThan )。

Hope I could help you. 希望我能帮助你。

// Edit: Sorry, I'm late ;-) //编辑:抱歉,我迟到了;-)

So here is a quite advanced example of how you can implement such a validator. 所以这是一个非常先进的例子,说明如何实现这样的验证器。

Note that I added a translate() method in order to catch language strings with PoEdit (a translation helper tool that fetches such strings from the source codes and puts them into a list for you). 请注意,我添加了一个translate()方法,以便使用PoEdit捕获语言字符串(一种翻译帮助工具,从源代码中提取这些字符串并将它们放入列表中)。 If you're not using gettext() , you can problably skip that. 如果你没有使用gettext() ,你可以跳过它。

Also, this was one of my first classes with ZF2, I wouldn't put this into the Application module again. 此外,这是我的第一个使用ZF2的类之一,我不会再将它放入Application模块中。 Maybe, create a new module that fits better, for instance MyDoctrineValidator or so. 也许,创建一个更适合的新模块,例如MyDoctrineValidator

This validator gives you a lot of flexibility as you have to set the query before using it. 此验证器为您提供了很大的灵活性,因为您必须在使用之前设置查询。 Of course, you can pre-define a query and set the entity, search column etc. in the options. 当然,您可以预先定义查询并在选项中设置实体,搜索列等。 Have fun! 玩得开心!

<?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