需要在课程范围之间切换

时间:2016-11-30 13:44:54

标签: php symfony scope doctrine

我有一个类(PersistenceClass),它接受一个数据数组(posts)并解析该数据并将其放入数据库(通过学说)。字段content需要在第二个类(SyntaxClass)解析之后才能被设置到学说实体中。

现在的问题是,SyntaxClass必须将内容中的引用设置为其他帖子(只是带有ID的链接)。因此它需要访问数据库,还需要在PersistenceClass中搜索持久但尚未刷新的实体。

我可以将一个学说EM注入SyntaxClass并在DB中找到我的参考文献,虽然我不太喜欢它。但更大的问题是,我如何才能访问PersistenceClass中唯一的持久但未刷新的实体?我可以创建一个这些对象的数组,并将其作为参数提供给解析器方法,如:

SyntaxClass->parseSyntax($content, $persistedObjects);

但这看起来不太干净。除此之外,我不知道是否可以在某种程度上搜索持久化对象的数据?

1 个答案:

答案 0 :(得分:1)

你的问题充满了子问题,所以,首先我会尝试清楚一些事情。

首先,您使用的命名约定有点过分,这对我和其他可能在将来处理您的代码的人没有帮助(也许您会成长,需要雇用更多的开发人员!:P)。所以,让我们从一些命名开始吧。

您所谓的PersistenceClass可能是这样的:

class PersistenceClass
{
    public function parse(array $posts)
    {
        foreach ($posts as $post) {
            // 1. Parse $post
            // 2. Parse content with SyntaxClass
            // 3. Persist $post in the database
        }
    }
}

同样适用于SyntaxClass:它接收$content并以某种方式解析它,然后设置引用然后继续。

这只是为了设定一些界限。

现在,回答你的问题。

  

我可以将一个学说EM注入SyntaxClass并找到我的参考文献   DB,虽然我不太喜欢它。

这正是你要做的! OOP开发以这种方式工作。

但是,这里出现了命名约定的问题,注入实体管理器的方式取决于类的结构。

好的设计应该使用services

因此,实际上PersistenceClassSyntaxClass现在应该被称为PersistenceServiceSyntaxService(如果我优先称它们为PersistenceManager和{{ 1}},因为在我的代码中我总是区分管理器和处理程序 - 但这是我的惯例,所以我不会在这里写更多关于它的内容。)

现在,我正在做的另一个错误的事情就是你正在做的事情(只读你的问题,我想象!):你正在实例化SyntaxManager(你当前命名为SyntaxService)来自{ {1}}(您当前命名为SyntaxClass)。这是错误的。

如果您需要为每个帖子提供PersistenceService的新实例,那么您应该使用工厂类(例如PersistenceClass),因此调用SyntaxService您将获得一个新的实例SyntaxFactory。工厂本身是否在新创建的SyntaxFactory::create()中注入实体管理器。

如果您不需要每个新的实例,相反,您只需将SyntaxService声明为服务,并通过注入将其传递给SyntaxClass。在这个最后一个更简单的例子下面:

SyntaxClass
  

但更大的问题是,我如何才能访问唯一持久的,但是   不是来自PersistenceClass的刷新实体?

现在第二个问题:如何搜索{persisted + flushed}和{persisted + not flushed}实体?

问题是你不能使用ID作为搜索参数,因为持久但未刷新的实体在刷新之前没有。

解决方案可能是创建另一项服务:PersistenceService。在其中,您也将注入实体管理器(如前所示)。

所以这个类有一个方法# app/config/service.yml services: app.service.persistence: class: ...\PersistenceService # Pass the SyntaxInstance directly or a factory if you need one aguments: ["@doctrine.orm.default_entity_manager", "@app.service.syntax"] app.service.syntax: class: ...\SyntaxService aguments: ["@doctrine.orm.default_entity_manager"] 来进行搜索。

要搜索持久但未刷新的实体,SearchReferencesService会为您提供一些有趣的方法:search()UnitOfWorkgetScheduledEntityInsertions()getScheduledEntityUpdates()和{ {1}}。

您正在谈论的数组已经存在:您只需要循环它并逐个比较,基于ID之外的字段进行搜索(因为它还不存在)。

不幸的是,由于您没有提供有关搜索性质的更多详细信息,因此我无法更准确地了解如何进行此搜索,但只告诉您必须使用工作单元进行搜索如果第一次搜索返回getScheduledEntityDeletions()结果,则连接到数据库。此外,您执行此搜索的顺序(在数据库之前,然后在工作单元中或反之亦然)取决于您。

希望这会有所帮助。