Symfony2 / Doctrine:从多个数据源构建对象

时间:2014-03-25 20:08:04

标签: php symfony doctrine

我正在开发一个电子商务Symfony2应用程序,我正试图找出如何组织我的模型以最适合我们正在做的事情。

我的问题是,此应用程序必须与实体店位置的库存系统连接,以检索库存和定价信息,但在Doctrine中存储与Web相关的数据。

所以我有一个产品对象:

class Product
{
    protected $id;
    protected $title;
    protected $description;
    protected $variants;
}

还有一个ProductVariant对象(用于精装/软皮书籍,不同尺寸的贴纸等产品。如果他们没有任何选择,产品会有"默认"变体):

class ProductVariant
{
    protected $id;
    protected $name; // "Hard Cover", IS persisted
    protected $otherData; // Placeholder for other persisted data for a variant.

    protected $price; // Not persisted in Doctrine
    protected $quantity; // Not persisted in Doctrine

    protected $backendID // The ID/SKU of this exact item in our backend database to look up prices
}

这些数据大部分将存储在Doctrine Entity(基本的Symfony东西)中,但我想知道在检索这些对象时如何引入其他数据。

我的理想目标是能够调用任何标准的Doctrine EM函数(find,findAll,findBy)并获取具有可用价格和数量的完整实体。

所以现在我认为我需要创建一个类似这样的ProductFactory(请注意,我正在急切地加载价格,因为我们基本上每次想要查看它们都需要它们一个产品):

$backendService = (A backend service from the Symfony DI container)
$em = (doctrine Product repo EM);

$product = $em->find($id);
foreach($product->getVariants() as $variant)
{
    $backendData = $backendService->getData($variant->getBackendID());
    // Possible caching of $backendData here? (currently it only updates once a day due to legacy constraints)

    $variant->setPrice($backendData->getPrice());
    $variant->setQuantity($backendData->getQuantity());
}

这个后端数据源将在明年发生变化,我们不知道如何从新系统中检索数据,因此将其作为服务构建似乎是有意义的,因为我可以稍后更改它以便创建它来自我们所拥有的任何新数据的一致BakendData对象。 1

但现在我有两个大问题:

  1. 我在哪里放置这个逻辑?就像我说的那样,由于大多数数据来自Doctrine,我希望能够继续使用所有Doctrine EM函数来构建这些实体,但是添加额外数据的额外步骤需要在某处发生。这是属于产品实体存储库的东西,还是属于在返回其对象之前以某种方式调用的单独的Model类?
    1. 这会如何影响大型请求?当某人正在查看包含100个产品的页面时,如果没有这些外部数据,则可以从PDO中选择100个项目,然后它们将作为基本预先构建的对象返回。通过此处理步骤,我似乎需要100多个额外的查询和处理步骤来为每个变体提取数据。 (其中一些数据可以缓存,我可以编写后端服务,以便能够同时请求许多ID,但这些ID仍然需要从学说中发现)
    2. 当然,我将尝试从后端服务中尽可能多地缓存信息,但处理步骤仍然存在。

      感谢你们给我的任何建议。

      脚注

      1. 我们当前的后端数据是通过夜间脚本导入MySQL数据库的,我已将其映射到Doctrine Entities,它是一个单独的包,我可以根据需要进行检索。在将来,我可能会看到REST API,ODBC连接,数据的平面CSV转储等。(管理层目前正在选择一个系统来运行物理存储,这将定义什么类型的数据我可以摆脱它。)

0 个答案:

没有答案