2013-08-07 11 views
15

背景使用Symfony 2 CLI工具,我怎樣才能爲子類生成正確的類型暗示的getter和setter?

我開發使用的Symfony 2,其被構造爲使得一個「核心」束定義實體,關係和字段的應用程序。其他捆綁包則可以通過繼承來專門化核心功能,即所謂的「子」捆綁包。

Doctrine 2註釋已被用於定義一個名爲「Package」的核心實體。一個「套餐」將建築設計和一塊土地聯繫在一起 - 基本上是一個房屋和土地的包裝。我已經將示例切換回了一個更基本的形式,因此在下面的示例中您將找不到Land和ChildLand的定義,但您可以假定它們已經以類似的方式實現。

更新

據freenode上的#symfony頻道的用戶,這是一個原則問題,因爲該應用程序/控制檯命令只是調用學說控制檯。我正在使用教義2.3。

此處給出了導致問題的總體情況應該幫助可視化場景的示意圖:

imgur link to full-size imageType hinting contract breaking

而且,這裏是一個錯誤報告的鏈接學說的問題跟蹤器:http://www.doctrine-project.org/jira/browse/DDC-2605

更新2 - 詳細ERD

釷實體之間關係的結構一直受到質疑,所以下面是我們正在實施的數據結構的一個更好的例子。

主要要求是再次提供核心類,提供一組共享的實體和字段。公司捆綁中的子類擴展了這些核心類。

我們確實考慮過EAV,但在這種方法中,我們將花費更多時間創建平臺和管理EAV數據的工具,而不是滿足當前的業務需求,我們將無法使用原則來管理實體,因爲它們將在數據庫中定義,等等等等。

隨着時間的流逝,我更好地理解了這個問題,它看起來唯一的問題是當它們破壞時,由doctrine的CLI工具生成的getters和setters類型暗示契約如下所述。當這些問題被手動糾正時,這個結構完美地工作。

imgur link to full-size imageDetailed data structure

與CLI工具

發電商因此,最初我使用的命令行工具......

> app/console doctrine:generate:entity 

...以產生具有基本字段映射實體存根,然後手動添加到土地的關係(當工具似乎不支持的關係):

這是所得到的代碼:

芯封裝實體:http://pastebin.com/3ujPT1mJ

子包單位:http://pastebin.com/sjAB0XJ2

生成getter和setter

接下來,我產生getter和setter通過執行:

> app/console doctrine:generate:entities CompanyCoreBundle 

> app/console doctrine:generate:entities CompanyChildBundle 

自動修改的核心和子實體的定義:

核心封裝實體:http://pastebin.com/kfQRxcnm

子包單位:http://pastebin.com/UdiPP9xX

的問題!

所以,問題的關鍵是這樣的:如果你比較核心和兒童捆setLand功能,你可以看到聲明是不同的:

​​3210

錯誤:(

不幸的是,不同類型的提示會導致發生PHP嚴格誤差,例如:

PHP Fatal error: Class 'Symfony\Component\Debug\Exception\ContextErrorException' not found in ... Company/ChildBundle/Entity/ChildPackage.php on line ... 

Runtime Notice: Declaration of ... should be compatible with ... in ... line ... 

錯誤的原因

做一些研究,爲什麼這是一個問題後,我在好幾個地方,改變類型提示在子類中斷裂類型提示合同閱讀(見本發佈:Is there a way to redefine a type hint to a descendant class when extending an abstract class?)。

選項?

有一些明顯的,但低於理想的選擇:

  • 我可以抑制嚴格的通知很容易,但我的開發經理baulks被在其創造我們的CI過程雪花例外的前景。
  • 我可以手動編輯教條生成的代碼,以刪除所有類型提示,或確保子類類型提示與父類相同。這樣做可以使代碼正常工作,但我可以看到它很乏味,除非我編寫一些腳本來爲我管理這些。
  • 我可以不使用命令行工具,手工製作我的實體和子實體。我寧願能夠自動化腳本:(

我的問題!!!(最後)

我的問題是,是否有可能使用命令行工具來做我想在這裏做的事情?理想情況下,我希望能夠執行doctrine控制檯命令來生成實體存根和getter和setter,而無需手動干預來修正子類中的類型提示。如果這不容易實現,那麼下一個最佳選擇是什麼?

感恩

謝謝!

+1

請問這幫助? http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html – jmlnik

+0

不是沒有徹底重新思考我的方法。首先,我需要每個關係的界面。第二個,也許主要原因是根據文檔「ResolveTargetEntityListener只能將目標更改爲單個對象」,而我需要將核心功能擴展到許多孩子,所以我將有'XPackage','YPackage'等等。謝謝你的迴應,我沒有意識到這個功能,並且肯定會考慮將來的場景。 –

+0

您要求提供一段代碼,您可以在這裏看到該教義無法處理繼承類重寫關係屬性的情況? –

回答

4

我不完全相信你會爲了定義實體使用的過程中,但爲了有效地創建一個持久化原則等實體GenericEngine和FordEngine,你想@MappedSuperclass

http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html#mapped-superclasses

這是一個抽象類的學說等價物。

在上面鏈接的頁面上還有一些其他有趣的繼承技巧。他們可能會幫助你。

至於自動生成這個東西,它可以是可行的,但超過我的薪酬等級+50聲望點。 :-)原則可以幫助你爲你的實體生成代碼模板,但實際上,設計實體和它們之間的關係的時間比用神奇的命令行組合來花費的時間要多得多。

(我自己,我有一個Manufacturer實體,然後有一個一對多的EngineManufacturer之間的關係。但是,這不是你問什麼。:-)

+0

感謝您的回覆。我將添加詳細的ERD,說明如果沒有實施EAV結構,「製造商」將無法正常工作;一個不同的蠕蟲罐。我們的結構可以滿足所有的業務需求,而且一旦學習者的類型提示錯誤被手動修正,就可以很好地工作。對數據結構的不同想法意味着我們可以永遠討論這個方面:-)。從時間上看,自動生成子類將提供持續的好處,除了類型提示問題外,某些教條的CLI工具支持得很好。如果不使用這些工具真的是答案,那麼我會接受它:/ –

+0

我已經添加了更新的ERD。感謝你的寶貴時間。 –

相關問題