背景使用Symfony 2 CLI工具,我怎樣才能爲子類生成正確的類型暗示的getter和setter?
我開發使用的Symfony 2,其被構造爲使得一個「核心」束定義實體,關係和字段的應用程序。其他捆綁包則可以通過繼承來專門化核心功能,即所謂的「子」捆綁包。
Doctrine 2註釋已被用於定義一個名爲「Package」的核心實體。一個「套餐」將建築設計和一塊土地聯繫在一起 - 基本上是一個房屋和土地的包裝。我已經將示例切換回了一個更基本的形式,因此在下面的示例中您將找不到Land和ChildLand的定義,但您可以假定它們已經以類似的方式實現。
更新
據freenode上的#symfony頻道的用戶,這是一個原則問題,因爲該應用程序/控制檯命令只是調用學說控制檯。我正在使用教義2.3。
此處給出了導致問題的總體情況應該幫助可視化場景的示意圖:
(imgur link to full-size image)
而且,這裏是一個錯誤報告的鏈接學說的問題跟蹤器:http://www.doctrine-project.org/jira/browse/DDC-2605
更新2 - 詳細ERD
釷實體之間關係的結構一直受到質疑,所以下面是我們正在實施的數據結構的一個更好的例子。
主要要求是再次提供核心類,提供一組共享的實體和字段。公司捆綁中的子類擴展了這些核心類。
我們確實考慮過EAV,但在這種方法中,我們將花費更多時間創建平臺和管理EAV數據的工具,而不是滿足當前的業務需求,我們將無法使用原則來管理實體,因爲它們將在數據庫中定義,等等等等。
隨着時間的流逝,我更好地理解了這個問題,它看起來唯一的問題是當它們破壞時,由doctrine的CLI工具生成的getters和setters類型暗示契約如下所述。當這些問題被手動糾正時,這個結構完美地工作。
(imgur link to full-size image)
與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,而無需手動干預來修正子類中的類型提示。如果這不容易實現,那麼下一個最佳選擇是什麼?
感恩
謝謝!
請問這幫助? http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html – jmlnik
不是沒有徹底重新思考我的方法。首先,我需要每個關係的界面。第二個,也許主要原因是根據文檔「ResolveTargetEntityListener只能將目標更改爲單個對象」,而我需要將核心功能擴展到許多孩子,所以我將有'XPackage','YPackage'等等。謝謝你的迴應,我沒有意識到這個功能,並且肯定會考慮將來的場景。 –
您要求提供一段代碼,您可以在這裏看到該教義無法處理繼承類重寫關係屬性的情況? –