簡體   English   中英

使用Symfony 2 CLI工具,如何為子類生成具有正確類型提示的getter和setter?

[英]Using Symfony 2 CLI tools, how can I generate getters and setters with correct type hinting for sub-classes?

背景

我正在使用Symfony 2開發一個應用程序,其結構使得“Core”包定義實體,關系和字段。 然后,其他捆綁包可以通過繼承來專門化核心功能,即所謂的“子”捆綁包。

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

更新

根據FreeNode的#symfony頻道上的用戶,這是一個學說問題,因為app / console命令只是調用了教條控制台。 我正在使用學說2.3。

下面的圖表顯示了導致問題可能有助於可視化場景的一般情況:

imgur鏈接到完整大小的圖像 類型提示合同中斷

此外,這里還有關於學說問題跟蹤器的錯誤報告的鏈接: http//www.doctrine-project.org/jira/browse/DDC-2605

更新2 - 更詳細的ERD

實體之間關系的結構受到質疑,因此下面是我們正在實施的數據結構的一個更好的例子。

主要要求是再次擁有提供共享實體和字段集的核心類。 公司包中的子類擴展了這些核心類。

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

隨着時間的推移,我開始更好地理解這個問題,似乎唯一的問題是由doctrine的CLI工具生成的getter和setter,因為它們打破了類型提示合同,如下所述。 當手動糾正這些問題時,此結構非常有效。

imgur鏈接到完整大小的圖像 詳細的數據結構

使用CLI工具生成實體

所以,最初我使用命令行工具......

> app/console doctrine:generate:entity

...使用基本字段映射生成實體存根,然后手動將關系添加到land(因為該工具似乎不支持關系):

這是結果代碼:

核心包實體: http//pastebin.com/3ujPT1mJ

子包實體: http//pastebin.com/sjAB0XJ2

生成Getters和Setter

接下來,我通過執行以下命令生成getter和setter:

> app/console doctrine:generate:entities CompanyCoreBundle

> app/console doctrine:generate:entities CompanyChildBundle

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

核心包實體: http//pastebin.com/kfQRxcnm

子包實體: http//pastebin.com/UdiPP9xX

問題!

因此,問題的關鍵在於:如果比較Core和Child包中的setLand函數,您可以看到聲明不同:

public function setLand(\Company\CoreBundle\Entity\Land $land = null)
public function setLand(\Company\ChildBundle\Entity\ChildLand $land = null)

錯誤:(

不幸的是,不同類型的提示導致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 ...

導致錯誤的原因

在研究了為什么這是一個問題之后,我在幾個地方讀到,在子類中改變類型提示打破了類型提示契約(參見這篇文章: 有沒有辦法在擴展抽象類時將類型提示重新定義為后代類? )。

選項?

有一些明顯但不太理想的選擇:

  • 我可以很容易地壓制嚴格的通知,但是我的開發經理不得不在我們的CI流程中創建雪花例外。
  • 我可以手動編輯doctrine生成的代碼以刪除所有類型提示,或者確保子類類型提示與父類相同。 這樣做會使代碼工作,但我可以看到它很乏味,除非我寫一些腳本來為我管理這個。
  • 我不能使用命令行工具並手動手工制作我的實體和子實體。 我寧願能用腳本自動化這個:(

我的問題!!! (最后)

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

感謝

謝謝!

我不確定你將使用什么過程來定義實體,但是為了有用地創建具有Doctrine的可持久實體,例如GenericEngine和FordEngine,你想要@MappedSuperclass

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

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

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

至於自動生成這些東西,它可能是可行的,但高於我的+50聲望點的工資等級。 :-) Doctrine可以幫助您為實體生成代碼模板,但實際上,設計實體及其關系的時間比花時間提出魔術命令行組合更好。

(我自己,我有一個Manufacturer實體,然后EngineManufacturer之間有一對多的關系。但那不是你問的。:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM