Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2-注释与yml/xml_Php_Orm_Doctrine Orm - Fatal编程技术网

Php Doctrine2-注释与yml/xml

Php Doctrine2-注释与yml/xml,php,orm,doctrine-orm,Php,Orm,Doctrine Orm,Doctrine2中实体描述注释的优点是什么 在Doctrine1&spreep(我已经使用过很多次)中,反向工程一个数据库来创建yml或xml,然后生成模型是一个非常快速的工作流 在Doctrine2中,选择注释时,必须编写大量的锅炉板代码,以使实体就位。。;然而,注释似乎是“前进的方向” 我缺少什么?我在yml或xml上使用注释的主要原因是易于配置。我不必查看其他文件来记住(例如)我在多个关系中设置的联接表名称。如果我更改了域对象中的某些内容(这在我开发过程的早期经常发生),我就不必记得用这

Doctrine2中实体描述注释的优点是什么

在Doctrine1&spreep(我已经使用过很多次)中,反向工程一个数据库来创建yml或xml,然后生成模型是一个非常快速的工作流

在Doctrine2中,选择注释时,必须编写大量的锅炉板代码,以使实体就位。。;然而,注释似乎是“前进的方向”


我缺少什么?

我在yml或xml上使用注释的主要原因是易于配置。我不必查看其他文件来记住(例如)我在多个关系中设置的联接表名称。如果我更改了域对象中的某些内容(这在我开发过程的早期经常发生),我就不必记得用这些更改更新另一个配置文件


但是,正如您所说的,数据库模式更容易移植到其他配置格式之一,因此在这种情况下,使用yml或xml而不是注释可能会更好。这一切最终归结为个人偏好。。。使用您最熟悉的方式。

您在D1和propel中描述的工作流程与Doctrin2的首选思维方式完全相反。事实上,我也避免在D1中编写自己的数据库定义,原因大致与我在这里给出的相同:

在教义2中,你首先关心的是你的实体。实体只是普通的PHP对象,而条令只是处理您的持久性。事实上,条令存在于幕后,将数据储存在某个数据库中,这实际上是事后才想到的。所有这些乱七八糟的东西正是你应该从中吸取的!从理论上讲,你可以在将来某个时候摆脱教条,编写自己的持久性逻辑。您的实体仍将像往常一样工作

从这个角度来看,从数据库模式开始是非常愚蠢的。您更感兴趣的是您的实体以及嵌入其中及其周围的业务逻辑。那汤真好吃

现在,由于您正在使用条令来持久化实体,所以(可能)将映射数据和类定义保持在一起是有意义的

因此,您的新工作流程是:

  • 通过定义一些普通的PHP类来设计一些实体
  • 在类定义上加上一些奇特的注释 细细咀嚼
  • /条令orm:schema:create
    让条令担心 数据库表定义
  • 现在,如果你有一些遗留数据库,事情会变得更加棘手,乐趣也会大大减少。我还没有真正处理过D2的那种场景,但我觉得它很难看

    关于样板代码:我看到人们抱怨必须为他们的实体编写getter/setter。我做了类似的事情——我的所有实体都扩展了一个AbstractEntity类,它使用神奇的方法为没有手工制作的属性生成getter/setter。一旦你这样做了,实际上就没有锅炉板了


    或者,现在有很多工具可以为您消除样板文件(PHPStorm可以做到这一点,Sublime插件等等)。这使得boiler plate相当轻松,而且还有一个额外的优点,即您可以添加类型提示,并且您的编辑器可以提供有用的自动完成功能。

    。为了获得客观的意见,至少在一个项目上坚持注释似乎是值得的。旅程的第一段将涉及许多样板代码,Doctrine2之所以伟大,原因之一是域模型不一定必须与数据库模型相对应。从这个意义上讲,条令1更具侵入性,因为它强制您的模型从条令_记录继承,而您的存储库从条令_表继承。如果您使用Symfony2,那么在生成实体方面会得到很多帮助,而且它还提供了选择是使用XML、YAML还是注释映射格式的选项。这使得您只需要定义实体之间的关系,我感觉到模型实际上与模式本身的耦合要小得多。我以前经常使用sf,但现在正在ZF上升级,所以现在是ZF 1.x/Doctrine2组合。sf2的额外支持并不令人惊讶;我以后会记住的。反应很好。我正在适应你在这里概述的新工作流程,但有一个缺点,我在这里有点抱怨,就是该开始了。我可以用SQL编写模式,在很短的时间内生成XML/yml和模型。然后我马上去领域逻辑。我理解在灵活性方面存在缺陷。我也考虑过像你提到的基类,但所有的魔法都有点慢:不过,为了时间,我最终可能会这么做。当我回到代码时,我会仔细看一下这个示例基类。一旦你掌握了窍门,你会发现这是一个非常快速的工作。您所有的工作都集中在一个地方,您只需使用orm:schema工具:update--dumpsql(或--force)。一旦将各种注释指令提交到内存中,工作就会快速进行。RE:神奇的方法,如果你需要优化,你可以随时回去手工制作setter/getter。在大多数情况下,您永远不会。True,True,但是除了(小:))性能优势之外,将函数标记到实体中的另一个好处是在生成的文档(如doxygen或phpDocumentor)中看到方法。当然,我正在使用基类完成编写实体的第一阶段。确实,神奇的方法会降低生成的文档或IDE自动完成的实用性。您可以使用@method向类文档中添加注释,文档工具和IDE将使用这些注释(se)