bestit/odm-param-converter-bundle

为best it odm提供symfony参数转换器

0.0.4 2020-06-22 11:19 UTC

This package is auto-updated.

Last update: 2024-09-22 20:25:07 UTC


README

此包为commercetools odm框架提供symfony参数转换器 - 类似于doctrine参数转换器。

安装

步骤1:下载Bundle

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

$ composer require bestit/odm-param-converter-bundle

此命令需要您全局安装Composer,如Composer文档中的安装章节中所述。

步骤2:启用Bundle

然后,通过将其添加到项目中app/AppKernel.php文件中注册的bundle列表中,来启用该bundle

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new BestIt\ODMParamConverterBundle\ODMParamConverterBundle(),
        );

        // ...
    }

    // ...
}

步骤3:使用

param converter的最简单用法是与标准id字段一起使用。转换器获取给定类(由odm提供)的仓库并获取项。只需将您的commercetools对象作为参数类型提示,并将路由id字段命名为id。内部,将执行findOneBy方法,如果未找到项,则抛出NotFoundException

示例

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{id}")
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

如果占位符的名称与主键名称不同,请传递id选项(现在您必须注释param converter)

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{your_route_id}")
 * @ParamConverter("customObject", class="Commercetools\Core\Model\CustomObject\CustomObject", options={
 *    "id" = "your_route_id"
 * }) 
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

如果您必须传递多个参数以获取项,则可以创建映射。只需在映射选项中创建键值对。键是您的路由名称(例如,“container_key”),值是您的commercetools对象字段(例如,“container”)

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{container_key}/{item_key}")
 * @ParamConverter("customObject", class="Commercetools\Core\Model\CustomObject\CustomObject", options={
 *    "mapping": {"container_key": "container", "item_key": "key"}
 * }) 
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

如果您的路由参数与您的commercetools对象字段相同,则可以跳过定义映射。只要您的路由中没有id键或已定义id选项,param converter就会这样做

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{container}/{key}")
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

有时,您想执行仓库的特定方法。您可以通过设置选项中方法的名称来轻松更改仓库方法。转换器将使用id的值作为方法参数执行方法。

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{id}")
 * @ParamConverter("customObject", class="Commercetools\Core\Model\CustomObject\CustomObject", options={
 *     "repository_method" = "findByMyOwnId",
 * }) 
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

当然,您可以混合使用仓库方法选项和您的映射。在以下代码中,转换器将执行findByCriteria。值将作为单个数组参数传递。

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{container}/{key}")
 * @ParamConverter("customObject", class="Commercetools\Core\Model\CustomObject\CustomObject", options={
 *     "repository_method" = "findByCriteria",
 * }) 
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

...

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{container_key}/{item_key}")
 * @ParamConverter("customObject", class="Commercetools\Core\Model\CustomObject\CustomObject", options={
 *    "repository_method" = "findByCriteria",
 *    "mapping": {"container_key": "container", "item_key": "key"}
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

但是,如果仓库不期望数组,则为例,自定义对象仓库的findByContainerAndKey期望字符串容器+字符串键,而不是数组

// CustomObjectRepository.php

public function findByContainerAndKey(string $container, string $key)
{
// ...
}

因此,您可以传递map_method_signature选项。如果为true,所有参数都将与方法参数匹配。

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{container}/{key}")
 * @ParamConverter("customObject", class="Commercetools\Core\Model\CustomObject\CustomObject", options={
 *     "repository_method" = "findByContainerAndKey",
 *     "map_method_signature" = true
 * }) 
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}

...

// YourController.php

/**
 * Get custom item
 *
 * @param CustomObject $customObject
 * @Route("/custom/{container_key}/{item_key}")
 * @ParamConverter("customObject", class="Commercetools\Core\Model\CustomObject\CustomObject", options={
 *    "repository_method" = "findByContainerAndKey",
 *    "mapping": {"container_key": "container", "item_key": "key"},
 *    "map_method_signature" = true
 */
public function balanceAction(CustomObject $customObject)
{
    // ...
}