2011-10-28 26 views
15

Trong cùng một thực thể tôi có một PreUpdate và PrePersist. Các PreUpdate cháy, nhưng PrePersist không bao giờ làm. Tôi đặt die() sau khi xả và bình luận trong vòng gọi lại vòng đời. thực thể đầy đủ có thể được nhìn thấy ở http://pastebin.com/yUk1u4GQDoctrine 2 PrePersist không kích hoạt

Entity callbacks

/** 
* @PreUpdate 
*/ 
public function fixDates(){ 
    $this->updatedOn = $this->getNow(); 
    $this->closedDate = null; 
    $this->openDate = null; 
    print "dates fixed"; 
} 

/** 
* @PrePersist 
*/ 
public function prePersist() { 
    print 'in prePersist'; 
    die(); 
} 

Entity Giám đốc gọi

$em->persist($school); 

$em->flush(); 
die(); 

màn hình của tôi đọc "số ngày cố định", nhưng không được thông báo prePersist. Tôi có số @HasLifecycleCallbacks ở đầu pháp nhân.

Trả lời

34

PrePersist chỉ được kích hoạt khi bạn đang thực hiện tuyên bố INSERT, không phải là tuyên bố UPDATE.

Khi thử nghiệm, đừng quên rằng câu lệnh UPDATE chỉ được kích hoạt khi thực thể thuộc tính thực sự thay đổi. Nếu Trình quản lý thực thể đang được gọi để duy trì thực thể đó, thì trước tiên nó sẽ trông nếu có bất kỳ thay đổi nào. Nếu không, không có truy vấn sql nào được thực hiện và không có phương thức @PreUpdate nào được gọi.

+0

Được thăng hạng. Tôi đã tìm ra điều này một cách khó khăn (thông qua bước gỡ lỗi) khi mã của tôi không hoạt động như tôi mong đợi. IMO tài liệu hiện tại không làm cho điều này rõ ràng đủ, cho một sai lầm dễ dàng để thực hiện là gì. – iainp999

4

Tôi vừa gặp sự cố tương tự. Hy vọng điều này sẽ giúp bạn:

Tôi đã quên nhập chú thích bằng tuyên bố sử dụng. Nếu bạn cố gắng dont này quên thêm "ORM" tiền tố:

use Doctrine\ORM\Mapping as ORM; 

// ... 

/** 
* @ORM\PreUpdate 
*/ 
public function preUpdate() 
{ 
} 
47

Đừng quên bật Vòng đời Callback trong lớp chú thích của mình:

/** 
* Report\MainBundle\Entity\Serveur 
* @ORM\HasLifecycleCallbacks 
*/ 
class Serveur { 
+0

Đây là vấn đề của tôi. Cảm ơn! – jasonlfunk

+0

Câu trả lời của bạn giải quyết được vấn đề của tôi. Cảm ơn ! –

+0

Tôi bị thiếu '@ HasLifecycleCallbacks'. Cảm ơn! – MParsons

9

Tôi biết câu hỏi này là gần 2 tuổi , nhưng tôi chỉ có cùng một vấn đề chính xác và vì điều này không có câu trả lời được chấp nhận, tôi muốn chia sẻ một điều cuối cùng mà mọi người khác quên đề cập đến.

Mặc dù có vẻ như phương thức được kích hoạt sẽ chỉ được sử dụng bởi chính lớp thực thể, phạm vi của nó phải được giữ công khai. Phương pháp của tôi không kích hoạt chỉ vì tôi đã đánh dấu nó là một phương thức được bảo vệ. Tôi hy vọng điều này sẽ giúp một ai đó.

3

Có lẽ nó phiên bản phụ thuộc nhưng chú thích làm việc của tôi có một cái nhìn tiếp theo:

thọ lớp chu kỳ chú thích:

/** 
* @Entity @Table(name="table_name") 
* @HasLifecycleCallbacks 
**/ 

Sự kiện chú thích:

/** @PrePersist **/ 
/** @PreUpdate **/ 

Đó là tất cả những gì tôi có trong Mô hình.

+0

Có !! Theo tài liệu trong học thuyết 2 Đánh dấu một phương thức trên thực thể được gọi là sự kiện @ PrePersist. Chỉ hoạt động với @ HasLifecycleCallbacks trong lớp thực thể PHP DocBlock. –

Các vấn đề liên quan