2013-03-22 45 views
1

我有一個數據庫結構,其中有一個字段content。在數據庫中,這是一個BLOB(所以一個string)。 content包含一個JSON編碼的字符串。Symfony2原則更改實體負載的值

當我加載這個,我想加載到一個特定的Content對象(不同的Content子類爲JSON的每種可能的格式)。

是否有任何事件或任何東西,我可以連上,所以我可以趕上實體是內置前值(所以我可以有setContent()類型一絲Content類,而不必是通用的,我會如果信息在攔截前被加載到實體中,則必須執行此操作)。

任何想法?


更多的細節。基本上我想象的是有某種類的Factory類,它接受一個JSON字符串並將其轉換爲適當的對象。

{ 
    body: "ABC", 
    value: 5 
} 

去一個類的對象是這樣的:

class MyContent extends Content 
{ 
    protected $body; 
    protected $value; 
} 

我不能用典型的對象映射,因爲它是一個JSON字符串的對象。


進一步澄清

基本上,我有一個名爲Box的實體。 Box的值爲content,該值應該是Content的實例。

在正常情況下,如果Content是一個正常的數據庫實體,我只想掛鉤BoxContent之間的一對一的關係,這將在該Box正確加載Content,而無需做任何特殊。

但是,在這種情況下,Content可以有多種形式。要處理這個問題,它將作爲一個JSON對象存儲在Box的表中的BLOB字段中。這意味着當學說試圖加載Box時,它會嘗試加載一個字符串。

我可以簡單地讓Box::setContent()接受任何參數並根據它是否爲字符串或Content對象來處理它。

然而,我想它,以便當它被用來它是總是一個Content對象,所以想要類型暗示爲函數(即,Box::setContent(Content $content))。問題是這會阻止Doctrine向該字段提供字符串。

這就是爲什麼我想攔截content的原則所取的值,並在將其加載到實體Box之前用適當的對象替換它。

我不認爲任何的教義事件都是我想要的,所以它可能不是真的。= S

+0

有一個(https://doctrine-orm.readthedocs.org/en/latest/reference/events.html?highlight=lifecycle#lifecycle-events)在可用[生命週期事件列表]文檔。不確定哪一個可能會用於您的案例,可能需要更多信息 – 2013-03-22 23:45:19

+0

在實體類的構造函數中加載內容對象怎麼樣? – Sethunath 2013-03-23 06:31:48

回答

0

最終我最終做的只是爲每個可能的Content類型創建不同的表和實體,然後使用Doctrine的繼承來讓Doctrine處理它們。不知道(因爲可能有很多很多類型,這意味着更多的表,我不能動態地構造新類型),但它現在運行良好。

Doctrine Inheritence

0

您應該可以將代碼添加到實體get方法來執行此操作。您還可以查看生命週期回調的教義:http://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-callbacks

+0

我無法將它添加到get方法,因爲那樣我就不能使用函數type-hinting來只接受適當的對象,因爲來自數據庫的數據是一個字符串。 – samanime 2013-03-23 00:13:51

+0

你在哪裏試圖添加類型提示? – 2013-03-23 07:13:51

+0

到'Box :: setContent()'方法。看到我對這個問題的更新。 – samanime 2013-03-25 00:19:34

0

您可以使用JMSSerializer從JSON創建實體 - https://github.com/schmittjoh/JMSSerializerBundle

我`噸理解你的問題,但也許你可以使用json_array型 - http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#doctrine-mapping-types

你需要從DB,比創建實體加載數據?或者加載一些實體嵌套實體從JSON反序列化的字段?

+0

我需要將數據庫中的字符串轉換爲實體,然後纔將其分配給實體。 – samanime 2013-03-25 00:20:24

+0

您可以使用http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#entity-listeners-class掛鉤實體管理器生命週期,並使用JMSSeriazer反序列化內容字段並設置它。 – 2013-03-25 11:42:14

+0

哪一個呢?唯一看起來相關的是postLoad,但似乎在它已經嘗試創建實體之後。在我的場景(帶有類型提示的字段)中,這會引發錯誤。 – samanime 2013-03-25 17:40:59