3

私は現在、Zend Framework 2 にますます慣れてきており、その間に Zend Framework 2 の検証部分について更新していました。Zend Db アダプターを使用してデータベースからのデータを検証する方法の例はほとんど見たことがありません。たとえば、Zend Framework 2 公式 Web サイトのコードは次のとおりです。

//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 の例の Album モジュールを更新して、Doctrine 2 を使用してデータベースと通信しました。私のコードに検証部分を追加します。

アルバム名をデータベースに追加する前に、同じアルバム名がデータベースに存在しないことを検証したいとしましょう。

これに関する情報は本当に役に立ちます!

4

2 に答える 2

5

if you use the DoctrineModule, there is already a validator for your case.

于 2012-09-07T09:27:15.893 に答える
2

私は同じ問題を抱えていて、このように解決しました:

  1. カスタム バリデータ クラスを作成し、名前を付けNoEntityExistsます (または任意の名前を付けます)。
  2. 拡張するZend\Validator\AbstractValidator
  3. のゲッターとセッターを提供するDoctrine\ORM\EntityManager
  4. オプション用の追加のゲッターとセッターを提供します (entityname など)。
  5. isValid($value)レコードが存在するかどうかを確認してブール値を返すメソッドを作成する
  6. これを使用するには、新しいインスタンスを作成し、 を割り当てて、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;
    }
}
于 2012-09-06T13:59:19.850 に答える