繁体   English   中英

学说2验证

[英]Doctrine 2 validation

我有验证问题。 在Doctrine 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());
} 

但我有两个问题:

  • 我不知道哪一列?
  • 我不想手动检查唯一

如果我从实体中跳过validate(),那么将捕获唯一(来自此error.log)

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

但是例如用户保存2条记录,第一条是错误的,但第二条有效,第一次保存后EntityManager将关闭,因为“EntityManager已关闭”,我无法保存第二条(好)记录。

哪个是这个问题的最佳解决方案?

在D2中进行验证的方法很少: - 与您在基于听众的验证后描述的一个实体相关的业务逻辑,请查看http://www.doctrine-project.org/docs/orm/2.0/en/ reference / events.html #preupdate ,ValidCreditCardListener示例 - 基于第三方库的验证,类似于此处描述的内容: Zend_Validate_Db_RecordExists with Doctrine 2? Zend_Validate:带有Doctrine的Db_NoRecordExists如果您使用特定的框架进行表单呈现,则可以将验证集成到其中。

我在实体中使用了与一个实体相关的业务逻辑验证:

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

和监听器验证强制一些规则,如唯一性,因为在我的应用程序中,实体不仅可以基于表单创建。

请记住在实体中定义@HasLifecycleCallbacks。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM