Проверка доктрины 2

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

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

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

Организация

/**
 * @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());
} 

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

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

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

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

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

Какое лучшее решение для этой проблемы?


person Robertoq    schedule 21.05.2011    source источник


Ответы (2)


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

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

/**
 * @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;
}

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

person WizardZ    schedule 17.11.2011

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

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