Я сейчас стал более знакомым с 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"; } }
Теперь мой вопрос заключается в том, как сделать часть проверки?
Например, мне нужно проверить имя перед вставкой в базу данных, чтобы проверить, что одно имя не существует в базе данных, я обновил модуль Album Album Zend Framework 2, чтобы использовать Doctrine 2 для связи с базой данных, и прямо сейчас я хочу добавьте часть проверки в мой код.
Скажем, перед добавлением имени альбома в базу данных я хочу подтвердить, что в базе данных не существует того же названия альбома.
Любая информация об этом будет действительно полезна!
У меня была такая же проблема, и я решил ее так:
NoEntityExists
(или что хотите). Zend\Validator\AbstractValidator
Doctrine\ORM\EntityManager
isValid($value)
который проверяет наличие записи и возвращает логическое значение EntityManager
и используйте его так же, как и любой другой валидатор. Чтобы получить представление о том, как реализовать класс validator, проверьте уже существующие валидаторы (желательно простые, такие как Callback
или 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; } }
если вы используете DoctrineModule, в вашем случае уже есть валидатор .