2012-07-04 19 views
9

Tôi có một vấn đề: trong một quá trình, tôi muốn hủy bỏ tiết kiệm một thực thể trong chức năng prePersit:Làm thế nào để hủy bỏ một thực thể tiết kiệm khi lưu trú tại chức năng prePersist

/** 
* @ORM\PrePersist 
*/ 
public function setTranslationsValue2() 
{ 
    if((null===$this->getContent())or($this->getContent()=='')) 
    { 
     //wanna stop saving this item??? 
     return false; 
    } 
} 

Tại chức năng ở trên, tôi không muốn để lưu thực thể này nữa, và không muốn dừng quá trình của tôi (quá trình vẫn lưu một số khác)

Trả lời

4

Bạn không thể thực hiện điều đó bằng chú thích prePersist trong thực thể của bạn. Vấn đề với cách tiếp cận của bạn là bạn không thể truy cập vào thực thểManager bên trong mô hình của bạn nhưng bạn sẽ cần điều đó để bảo anh ta không kiên trì sự ghen tị của bạn.

Bạn có thể sử dụng một người biết lắng nghe sự kiện như được giải thích trong tài liệu thuyết: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners

Sau đó bạn sẽ lắng nghe các sự kiện prePersist, xem nếu bất kỳ thực thể của các loại trong câu hỏi yêu cầu để được tiếp tục tồn và xem nếu tình trạng của bạn là thật. Nếu vậy, bạn có thể nói với thực thểManager để tách thực thể.

NHƯNG Tôi đoán bạn có thể làm điều đó đơn giản hơn nhiều bằng cách thiết lập các nội dung để notnull và chuyển nội dung đến null nếu chiều dài là < 1. Đảm bảo để tồn tại các đơn vị đúng là một phần của logic tên miền của bạn và tôi sẽ không làm điều này trong chính tổ chức hoặc một số người nghe sự kiện. Nếu bạn có nhiều người nghe như vậy và điều kiện, bạn kết thúc với nhiều khó khăn ma thuật không ai biết về.

Bên cạnh cách tiếp cận ở trên, bạn có thể triển khai phương thức hợp lệ() và kiểm tra xem các điều kiện nhất định có được đáp ứng hay không. Logic miền của bạn sẽ chỉ tồn tại thực thể nếu hợp lệ() là đúng. Một cách tiếp cận tốt hơn nữa là sử dụng trình xác nhận hợp lệ của symfony2 để xác nhận thực thể của bạn và sau đó hành động phù hợp.

+0

Cảm ơn bạn, tôi sẽ cố gắng tạo trình xử lý sự kiện. – user1501227

+0

Quyền truy cập vào tài liệu bị hạn chế, vui lòng kiểm tra liên kết. Tôi nhận được "Bạn không có quyền truy cập vào phiên bản này." –

+0

Cảm ơn bạn đã gợi ý. Liên kết mới là http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners. Tôi đã chỉnh sửa câu trả lời gốc cho phù hợp! – Sgoettschkes

2

Chỉ cần ném ngoại lệ mới ("Một số thư ...");

+0

OP yêu cầu giải pháp không dừng quá trình tổng thể. –

+1

Đó là lý do tại sao bạn bắt Ngoại lệ từ mã gọi và xử lý kịch bản. – caponica

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