首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Symfony 2 CLI工具,如何生成具有正确类型提示子类的getter和setter?

使用Symfony 2 CLI工具,如何生成具有正确类型提示子类的getter和setter?
EN

Stack Overflow用户
提问于 2013-08-07 08:36:55
回答 1查看 2.8K关注 0票数 15

背景

我正在使用Symfony 2开发一个应用程序,该应用程序的结构使得"Core“包定义了实体、关系和字段。然后,其他捆绑包就可以通过继承来专门化核心功能,即所谓的“子”包。

理论2注释已被用来定义一个称为“包”的核心实体。一个“包”把一个建筑设计和一块土地联系在一起--本质上是一套房屋和土地。我已经将示例削减到了一个更基本的形式,因此在下面的示例中您将找不到Land和ChildLand的定义,但是您可以假设它们是以类似的方式实现的。

更新

根据FreeNode #symfony频道上的用户,这是一个理论问题,因为app/控制台命令只是调用原则控制台。我使用的是理论2.3。

下面是一个图表,显示了导致问题的一般情况,这应该有助于将场景可视化:

(链接到全尺寸图像)

此外,这里还有一个链接,指向一个关于理论问题跟踪器的错误报告:http://www.doctrine-project.org/jira/browse/DDC-2605

更新2-更详细的ERD

实体之间关系的结构受到了质疑,因此下面是我们正在实现的数据结构的一个更好的例子。

主要的要求还是要有提供一组共享的实体和字段的核心类。公司包中的子类扩展了这些核心类。

我们确实详细地考虑了EAV,但是在这种方法中,我们将花费更多的时间来创建一个平台和工具来管理EAV数据,而不是满足当前的业务需求,我们将无法使用理论来管理实体,因为它们将在数据库中定义等等。

随着时间的推移,我对这个问题有了更好的理解,似乎唯一的问题是理论的CLI工具生成的better和setter,因为它们打破了下面提到的类型暗示契约。当手动纠正这些问题时,这个结构工作得很好。

(链接到全尺寸图像)

工具生成实体

所以,一开始我使用命令行工具..。

代码语言:javascript
复制
> app/console doctrine:generate:entity

...to生成具有基本字段映射的实体存根,然后手动将关系添加到land (因为工具似乎不支持关系):

这是生成的代码:

核心包实体:http://pastebin.com/3ujPT1mJ

子包实体:http://pastebin.com/sjAB0XJ2

生成Getters和Setters

接下来,我通过执行以下命令生成getter和setter:

代码语言:javascript
复制
> app/console doctrine:generate:entities CompanyCoreBundle

> app/console doctrine:generate:entities CompanyChildBundle

它自动修改核心实体和子实体定义:

核心包实体:http://pastebin.com/kfQRxcnm

子包实体:http://pastebin.com/UdiPP9xX

问题!

因此,问题的关键是:如果比较核心和子包中的setLand函数,可以看到声明是不同的:

代码语言:javascript
复制
public function setLand(\Company\CoreBundle\Entity\Land $land = null)
public function setLand(\Company\ChildBundle\Entity\ChildLand $land = null)

错误:( )

不幸的是,不同类型的提示会导致PHP严格错误的发生,例如:

代码语言:javascript
复制
PHP Fatal error:  Class 'Symfony\Component\Debug\Exception\ContextErrorException' not found in ... Company/ChildBundle/Entity/ChildPackage.php on line ...

代码语言:javascript
复制
Runtime Notice: Declaration of ... should be compatible with ... in ... line ...

错误的原因

在对为什么这是一个问题进行了一些研究之后,我在几个地方读到,在子类中更改类型暗示会打破类型暗示契约(参见本文:在扩展抽象类时,是否有方法重新定义子类的类型提示?)。

选项?

有一些明显但不太理想的选择:

  • 我可以很容易地压制严格的通知,但是我的开发经理对在我们的CI过程中创建雪花异常的前景感到困惑。
  • 我可以手动编辑原则生成的代码,以删除所有类型提示,或者确保子类类型提示与父类相同。这样做可以使代码工作,但我可以看到它是乏味的,除非我为自己编写一些脚本来管理它。
  • 我只是不能使用命令行工具和手工手工我的实体和子实体手动。我更希望能够用脚本实现这一点:(

我的问题!(最后)

我的问题是,是否可以使用命令行工具来完成我在这里试图做的事情?理想情况下,我希望能够执行原则控制台命令来生成实体存根、getter和setter,而无需手动干预来修复子类中的类型提示。如果这是不容易实现的,那么接下来的最佳选择是什么?

感恩

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-08-17 02:31:58

我不太清楚您将使用什么过程来定义实体,但是为了使用GenericEngine和FordEngine这样的原则创建可持久的实体,您需要@MappedSuperclass

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

这是相当于抽象类的教义。

在上面链接的页面上还有其他一些有趣的继承技巧。他们可能会帮你。

至于自动生成这些东西,它是可行的,但高于我的薪酬等级+50个声誉点。

(我自己,我会有一个Manufacturer实体,然后在EngineManufacturer之间有一对多的关系。但你不是这么问的。:-)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18098552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档