bestit/commercetools-odm

使用 doctrine commons api 使 commercetools 数据库可访问。

1.22.2 2021-03-17 13:11 UTC

This package is auto-updated.

Last update: 2024-09-17 21:10:55 UTC


README

使用 doctrine common api 包装commercetools/php-sdk

安装

步骤 1:下载

打开命令行,进入项目目录并执行以下命令以下载此扩展包的最新稳定版本

$ composer require bestit/commercetools-odm

此命令需要您全局安装了 Composer,具体请参考 Composer 文档的安装章节

步骤 2:启用

odm 的核心脚本是基于 Doctrine\Common\Persistence\ObjectManagerBestIt\CommercetoolsODM\DocumentManager。只需填充其依赖项即可。

您可以使用我们的 bestit/commercetools-odm-bundle 来启动您的项目。

使用方法

一个小型使用示例

<?php

// Load the product repository.
/** @var \BestIt\CommercetoolsODM\DocumentManagerInterface $documentManager */
/** @var \BestIt\CommercetoolsODM\Repository\ProductRepository $repository */
$repository = $documentManager->getRepository(\Commercetools\Core\Model\Product\Product::class);

// Fetch it from the database or create a new instance.
/** @var \Commercetools\Core\Model\Product\Product $product */
$product = $repository->findByKey($key) ??
    $documentManager->getClassMetadata(\Commercetools\Core\Model\Product\Product::class)->getNewInstance();

// Do your work.
if (!$product->getId()) {
    $product
        ->setProductType(\Commercetools\Core\Model\ProductType\ProductTypeReference::ofId('type'))
        // ....
}

// You get automatic but simple 409 conflict resolution if you use  this callback. If not, 409s lead to an exception. 
$documentManager->modify($product, function(\Commercetools\Core\Model\Product\Product $product) {
    $product->setKey('new-key');
});

// Persist the changes
$documentManager->persist($product);

// Detach it from the document manager (UnitOfWork) after flush.
$documentManager->detachDeferred($product);

// Flush the changes in the document manager to the repository.
$documentManager->flush();

贡献

关于如何为这个库贡献的一些建议...

元数据

这是这个库的主要问题:如何将 commercetools sdk 的结构映射到统一的 api。我们目前使用映射表来解决此问题。

<?php
// ./src/Resources/config/metadata.php

use BestIt\CommercetoolsODM\Mapping\Annotations\RequestMap;

return [
    // Your model
    \Commercetools\Core\Model\Cart\Cart::class => [
        // The draft class for creating a new model
        'draft' => \Commercetools\Core\Model\Cart\CartDraft::class,
        // Which repo to use
        'repository' => \BestIt\CommercetoolsODM\Repository\CartRepository::class,
        // And the map for every needed request type.
        'requestClassMap' => (new RequestMap())
            ->setCreate(\Commercetools\Core\Request\Carts\CartCreateRequest::class)
            ->setDeleteById(\Commercetools\Core\Request\Carts\CartDeleteRequest::class)
            ->setFindById(\Commercetools\Core\Request\Carts\CartByIdGetRequest::class)
            ->setFindByCustomerId(\Commercetools\Core\Request\Carts\CartByCustomerIdGetRequest::class)
            ->setQuery(\Commercetools\Core\Request\Carts\CartQueryRequest::class)
            ->setUpdateById(\Commercetools\Core\Request\Carts\CartUpdateRequest::class)
    ],

    // ... map more models
];

动作构建器

尽管我们采用面向对象的方式,但我们仍然支持 commercetools 的部分更新。请参考 BestIt\CommercetoolsODM\ActionBuilder\ActionBuilderInterface 接口以添加您自己的动作构建器。动作构建器创建与 changed property values 匹配的请求动作以发送到 commercetools。

在更改动作构建器设置后,请重新设置缓存。

进一步步骤

  • 减少假设,例如,每个标准模型都有一个 id 和版本
  • 移除对产品发布标记的硬连接,以发布预发布版本
  • 添加每个动作构建器。目前并非所有内容都包含在内。
  • 更多单元测试
  • 更多文档
  • 命名标准化:从 "documents" 移向 "objects"