Доктрина 2 проверки - PullRequest
6 голосов
/ 21 мая 2011

У меня проблема с проверкой.В Doctrine 1 я использовал это:

if ($model->isValid()) {
    $model->save();
} else {
    $errorStack = $model->getErrorStack();
    ...
}

, а в $ errorStack я получил имя столбца и сообщение об ошибке.Но в Doctrine 2 я могу использовать только это:

Entity

/**
 * @PrePersist @PreUpdate
 */
public function validate()
{
    if ($this->name == null)) {
        throw new \Exception("Name can't be null"); 
    }
}

Контроллер:

try {
    $user = new \User();
    //$user->setName('name');
    $user->setCity('London');
    $this->_entityManager->persist($user); 
    $this->_entityManager->flush();
} catch(Exception $e) {
    error_log($e->getMessage());
} 

но у меня есть две проблемы с этим:

  • я не знаю, какой столбец?
  • я не хочу проверять уникальность вручную

Если я пропущу validate () для сущности, то будет отловлено уникальное (из этого error.log)

Unique violation: 7 ERROR:  duplicate key value violates unique constraint "person_email_uniq"

но, например, пользователь сохранил 2 записи, и первая неверна, но вторая действительна, после первого сохранения EntityManager закроется, и я не могу сохранить вторую (хорошую) запись из-за того, что «EntityManager закрыт».

Как лучше всего решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Есть несколько способов сделать проверку в D2: - бизнес-логика, связанная с одной сущностью, как вы описали в своем посте - проверка на основе слушателей, проверьте http://www.doctrine -project.org / docs / orm / 2.0 / en / reference / events.html # preupdate , пример ValidCreditCardListener - проверка на основе сторонних библиотек, нечто подобное описано здесь: Zend_Validate_Db_Record существует с Doctrine 2? и Zend_Validate: Db_NoRecord существует с доктриной Если вы используете определенный фреймворк для рендеринга форм, вы можете интегрировать в него валидацию.

Я использовал проверку сущностей для бизнес-логики, связанной с одной сущностью:

/**
 * @PrePersist @PreUpdate
 */
public function validate()
{
    $this->errors = array();
    if ($this->name == null)) {
        $this->errors['name'][] = 'Something wrong'; 
    }
    if (0 < count($errors)) {
        throw new Exception('There are errors');
    }
}

public function getErrors()
{
   return $this->errors;
}

и проверка прослушивателей для принудительного применения некоторых правил, таких как уникальность, поскольку в моем приложении сущности могут создаваться не только на основе форм.

2 голосов
/ 19 ноября 2011

Не забудьте определить @HasLifecycleCallbacks в сущности.

/**
 * @Entity @Table(name="songs") @HasLifecycleCallbacks
 */
class Song
{
   ...
   /** @PrePersist @PreUpdate */
    public function doStuffOnPreUpdatePrePersists()
    {
      ...
    }
}
...