【问题标题】:How do I persist models properly in Symfony2?如何在 Symfony2 中正确保存模型?
【发布时间】:2012-01-22 22:31:08
【问题描述】:

我一直对Symfony2中模型(实体)持久化的概念很疑惑。 AFAIK,在 Symfony2 中没有像 model_instance->save() 这样的东西。相反,它必须通过检索理论实体管理器在控制器中调用,然后持久化 model_instance 并刷新 model_instance。

  • 如果我有一个博客模型,其中包含变量标签模型实例和类别模型实例,它们将从博客消息正文中生成。但是,我不知道如何创建博客工厂来保存这些标签和类别,相反,我必须从工厂返回这些“标签”和“类别”实例(无论如何它都不会持续存在)---那里我无法在博客中的单一方法中保留博客并将标签和类别全部保留。

事实上,如果我想编写一个定期调用的脚本来持久化模型,这似乎是不可能的,因为它必须调用控制器,但我不明白为什么脚本需要存在 Web 服务器,但不仅仅是在不接触 Web 服务器的情况下处理对象模型。

我非常感谢如何解决上述问题。谢谢!

【问题讨论】:

  • 如果你不接触网络服务器,你在哪里保存数据?您是否有一个单独的数据库服务器希望客户端直接连接?
  • 谢谢。有几个地方:1)保存在单元测试中进行验证(我有一些来回查询的方法,请不要问为什么会在那里。)2)在Cron中运行,我没有理由这样做相信它应该通过网络服务。 3)保存标签/类别模型实例而不返回(erzult 通过 Transitive Persistence Cascade Operations 建议,我正在研究它)此外,我无法在 PHPUnit 中测试保存数据而不强迫我为为了测试意味着我冒着我的代码以后失败的风险。我很困惑。
  • 啊,不是你不想接触网络服务器,而是你不想使用控制器。这更有意义:)

标签: php symfony doctrine-orm


【解决方案1】:

你说得对,Doctrine2 是DataMapper 模式的实现。所以这些概念不同于由 Doctrine1 和 Propel 等其他一些 ORM 实现的ActiveRecord

默认情况下,当您创建具有某些关系的实体时,您必须手动保存主要实体其关系。但是您可以更改此行为以激活持久性级联:

http://www.doctrine-project.org/docs/orm/2.1/en/reference/working-with-associations.html#transitive-persistence-cascade-operations

【讨论】:

    【解决方案2】:

    在您的 cmets 中,您提到了测试。这里有一个关于测试学说的食谱库:http://symfony.com/doc/current/cookbook/testing/doctrine.html

    Symfony2 实际上是一个解耦的库包。虽然使用教义的默认方式是通过控制器,但您可以直接加载教义库。我不确定您如何单独访问该学说包,但我相信上面文章中的示例将对此有所帮助。

    此外,Fabien Potencier(symfony 的首席开发人员)最近发表了关于 Symfony 是一组可以独立使用的捆绑包的演讲。他介绍了如何使用大部分捆绑包的基础知识。你可以在这里查看:http://symfony.com/video/Paris2011/583

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 1970-01-01
      • 2013-11-23
      • 2016-06-13
      • 2019-03-14
      • 2012-07-23
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多