首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理论2验证

理论2验证
EN

Stack Overflow用户
提问于 2011-05-21 15:51:13
回答 2查看 3.8K关注 0票数 6

我在验证方面有问题。在原则1中,我使用了这样的方法:

代码语言:javascript
复制
if ($model->isValid()) {
    $model->save();
} else {
    $errorStack = $model->getErrorStack();
    ...
}

在$errorStack中,我得到了列名和错误消息。但在原则2中,我可以用它:

实体

代码语言:javascript
复制
/**
 * @PrePersist @PreUpdate
 */
public function validate()
{
    if ($this->name == null)) {
        throw new \Exception("Name can't be null"); 
    }
}

主计长:

代码语言:javascript
复制
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)

代码语言:javascript
复制
Unique violation: 7 ERROR:  duplicate key value violates unique constraint "person_email_uniq"

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

解决这个问题的最好办法是什么?

EN

回答 2

Stack Overflow用户

发布于 2011-11-17 20:01:53

在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: Db_NoRecordExists with Doctrine --如果您使用特定的表单呈现框架,则可以将验证集成到其中。

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

代码语言:javascript
复制
/**
 * @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;
}

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

票数 3
EN

Stack Overflow用户

发布于 2011-11-19 00:09:19

记住在实体中定义@HasLifecycleCallback。

代码语言:javascript
复制
/**
 * @Entity @Table(name="songs") @HasLifecycleCallbacks
 */
class Song
{
   ...
   /** @PrePersist @PreUpdate */
    public function doStuffOnPreUpdatePrePersists()
    {
      ...
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6082815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档