2013-02-25 1 views
2

저는 ZF2와 Doctrine-Module에서 Doctrine 2를 사용하고 있습니다. 나는 PreUpdate을 필요로 엔티티를 작성했습니다 | PrePersist, 교리는 날짜 허용하지 않기 때문에 | 기본 키에 날짜 시간을 : 나는 날짜 I로 날짜 시간을 설정하면Doctrine HasLifecycleCallbacks PrePersist | PreUpdate가 실행되지 않습니다.

<?php 

namespace Application\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
* @ORM\Table(name="sample") 
*/ 
class Sample 
{ 

    /** 
    * 
    * @ORM\Id 
    * @ORM\Column(type="string") 
    * @var integer 
    */ 
    protected $runmode; 

    /** 
    * 
    * @ORM\Id 
    * @ORM\Column(type="date") 
    * @var DateTime 
    */ 
    protected $date; 


    public function getRunmode() 
    { 
     return $this->runmode; 
    } 

    public function setRunmode($runmode) 
    { 
     $this->runmode = $runmode; 
     return $this; 
    } 

    public function getDate() 
    { 
     return $this->date; 
    } 

    public function setDate($date) 
    { 
     $this->date = $date; 
     return $this; 
    } 

    /** 
    * 
    * @ORM\PreUpdate 
    * @ORM\PrePersist 
    */ 
    protected function formatDate() 
    { 
     die('preUpdate, prePersist'); 
     if ($this->date instanceof \DateTime) { 
      $this->date = $this->date->format('Y-m-d'); 
     } 
     return $this; 
    } 

} 

문제는, 지금 메시지를 받으십시오 :

"Object of class DateTime could not be converted to string" 

형식 날짜로 이동하지 않기 때문에 메시지를 받으십시오. 당신이 datetime로 필드 Sample#date를 매핑하기 때문에 모든

답변

5

첫째, 항상 null 또는 DateTime의 인스턴스 중 하나이어야한다.

따라서 다음과 같이 setDate 방법을 typehint해야

또한
public function setDate(\DateTime $date = null) 
{ 
    $this->date = $date; 
    return $this; 
} 

, 당신의 방법 formatDate의 가시성 따라서 ORM 액세스 protected하지 않기 때문에 lifecycle callback가 호출되지 않습니다. public으로 변경하면 제대로 작동합니다. 아무런 변환도 필요하지 않으므로 제거 할 수 있습니다.

+0

내 경우에는 'ORM : PrePersist'가 무시됩니다. 서비스 나 다른 서비스를 등록 했습니까? – Ron

+2

@Ron 콜백입니다. 공개이어야하며 메타 데이터에 등록되어야합니다. – Ocramius

+0

감사합니다! 하지만 어떻게 그것을 메타 데이터에 등록합니까? 전에 이것을 본 적이 없습니까? 아니면 아마도 trival일까요? – Ron

관련 문제