我目前正在嘗試使我們的 Symfony 專案型別安全,從而對其進行一些重構,因為它在這里和那里使用了一些反模式。我的問題是我無法想出一個好的模式來轉換物體屬性。讓我詳細說明:
讓我們以我們的語言物體為例:
Language- 屬性:int $id,字串 $locale,字串 $name
- 存盤不同的語言(例如 '1|de|German' 或 '2|en|English')
LanguageToken- 屬性:int $id,字串 $token
- 存盤翻譯鍵(=token)(例如'1|user_firstName')
LanguageTranslation- 屬性:int $id、Language $language、LanguageToken $token、string $translation
- 定義特定語言中標記的翻譯(例如'1|1|1|Vorname'),所以我們在這里有ManyToOne關系
現在的目標是在其實際物件和用戶友好的字串表示之間轉換 Entity 實體,例如,在 LanguageTranslation 表單中使用它來擁有一個文本欄位,您可以在其中Language通過其用戶友好的字串表示(它使用name 屬性)與預先輸入的組合。
為了解決這個問題,我創建了一個通過簡單地回傳屬性或空字串LanguageDataTransformer來將語言物體轉換為其用戶友好字串的 -方向。transform這reverseTransform也很簡單:它接受名稱并在資料庫中搜索具有給定名稱屬性的語言并回傳它,如果不存在則拋出例外。然后使用 -function 將此 DataTransformer 應用于正確的表單欄位addModelTransformer。
雖然這對于處理外部表單輸入和內部物體物件之間的轉換非常有效,但我們還通過將物體轉換為其屬性的資料陣列以通用方式“序列化”我們的物體(對于標量型別不變,但對于用戶友好的字串物件)在toArray()函式中。反過來也存在將這樣的資料陣列轉換回其物體物件。這是必需的,因為我們將物體從/匯入到不同的格式(例如 JSON)。
由于這與表單處理中的轉換(例如語言欄位)基本相同,因此我嘗試重用已經撰寫的 DataTransformer。現在的問題是我無法將 嵌入LanguageDataTransformer物體中LanguageTranslation。Transformer 內部使用EntityManager,所以它需要通過 Symfony 的自動裝配來實體化。如何讓 Symfony 在我的物體中自動裝配 Transformer?特別是考慮到fromArray- 方法是靜態的(因為它就像構造物體的工廠),但需要訪問實體化的轉換器以進行構造程序。
對于正確模式的提示,我會很高興。提前致謝!
uj5u.com熱心網友回復:
我發現了我的問題:我們的物體是手動實體化的(即通過呼叫類似的東西new LanguageTranslation()),所以 Symfony 無法為這些物體實體化所需的服務。
我決定將每個物體的匯入/匯出邏輯(即toArray和fromArray)提取到一個單獨的服務類,然后可以將其注入代碼中所需的匯入/匯出位置。這樣,Symfony 注入所需的依賴項,物體或其資料陣列分別作為引數傳入。這也導致更好的松散耦合和關注點分離。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/475557.html
