idci/exporter-bundle

Symfony ExporterBundle

安装次数: 20,637

依赖项: 2

建议者: 3

安全: 0

星标: 3

关注者: 5

分支: 2

开放问题: 2

类型:symfony-bundle

v1.0.0 2013-08-29 17:06 UTC

This package is auto-updated.

Last update: 2024-08-24 20:39:11 UTC


README

Symfony2 导出包

安装

要安装此包,请按照以下步骤操作

首先在您的 composer.json 文件中添加依赖项

"require": {
    ...
    "idci/exporter-bundle": "dev-master"
},

然后使用以下命令安装包

php composer update

在您的应用程序内核中启用包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new IDCI\Bundle\ExporterBundle\IDCIExporterBundle(),
    );
}

现在包已安装。

如何使用

首先在您的 config.yml 中声明可以导出的实体

idci_exporter:
    entities:
       entity_reference:
            class: "My\\Entity\\Namespaced\\Name"

默认情况下,导出使用 twig 引擎创建导出文件。我们稍后将看到您可以创建自己的转换器。目前,在 YourBundle/Resources/exporter/EntityName 中创建一个目录。然后创建所需的模板,将实体转换为特定格式(目前为 csv、ics、json、xml)如下

  • export.csv.twig
  • export.ics.twig
  • export.json.twig
  • export.xml.twig

在您的模板中,通常应使用 twig 变量 entity,例如 {{ entity.id }}

最终,只需按如下方式使用服务来导出实体到指定格式

$export = $this->container->get('idci_exporter.manager')->export($entities, $format);

这将返回一个包含导出数据的 Export 对象。

$export->getContent();

获取 MIME 类型格式

$export->getContentType();

高级配置

您可以为每种格式自定义实体转换器。默认情况下,使用 idci_exporter.transformer_twig 服务来转换实体。要使用其他转换器,创建自己的服务,实现 TransformerInterface.php,然后将其与特定格式关联,如下所示

idci_exporter:
    entities:
       entity_reference:
            class: "My\\Entity\\Namespaced\\Name"
            formats:
                json:
                    transformer:
                        service: "myTransformerServiceName"

如果您想更改 TwigTransformer 模板路径或模板名称,可以使用一些转换器选项

idci_exporter:
    entities:
       entity_reference:
            class: "My\\Entity\\Namespaced\\Name"
            formats:
                json:
                    transformer:
                        service: "myTransformerServiceName"
                        options:
                            template_path: "my/new/template/path"
                            template_name_format: "myFormat.%s.ext"

默认情况下,模板路径在实体包目录 Resources/exporter/EntityName/ 中查找。模板名称格式类似于 export.%s.twig,其中 %s 由格式(例如:xml、json、csv 等)替换。

如何导出为 jsonp 格式

如果您已经有一个 json 导出,导出为 jsonp 格式将非常简单。只需添加一个新格式,将模板名称选项设置为 export.json.twig

因此,只需在您的 config.yml 中添加以下内容

idci_exporter:
    entities:
        entity_reference:
            class: "My\\Entity\\Namespaced\\Name"
            formats:
                jsonp:
                    transformer:
                        options:
                            template_name_format: "export.json.twig"

使用 API

此包帮助您通过 HTTP 请求以给定格式获取实体。为此,将控制器添加到 app/config/routing.yml 中,如下所示

idci_exporter:
    resource: "../../vendor/idci/exporter-bundle/IDCI/Bundle/ExporterBundle/Controller"
    type:     annotation

然后您将能够向以下路由发送请求

exporter_api_norewrite            ANY    /api/query
exporter_api                      ANY    /api/{entity_reference}.{_format}

{entity_reference} 是一个必需参数。这是在您的 config.yml 中定义的值。

idci_exporter:
    entities:
        entity_reference:
            class: "My\\Entity\\Namespaced\\Name"

如果您收到 UndefinedExportableEntityException 异常,这意味着您没有为实体正确定义导出配置(例如,URL 可能不匹配实体引用参数)。

然后您必须在您的 EntityRepository 中创建一个 extract 函数,该函数返回一个 DoctrineCollection。此函数接受 $params 变量作为参数,可以用于过滤结果。

以下是一个示例

/**
 * extractQueryBuilder
 *
 * @param array $params
 * @return QueryBuilder
 */
public function extractQueryBuilder($params)
{
    $qb = $this->createQueryBuilder('cer');

    if(isset($params['id'])) {
        $qb
            ->andWhere('cer.id = :id')
            ->setParameter('id', $params['id'])
        ;
    }

    if(isset($params['category_id'])) {
        $qb
            ->leftJoin('cer.categories', 'c')
            ->andWhere('c.id = :cat_id')
            ->setParameter('cat_id', $params['category_id'])
        ;
    }

    if(isset($params['category_ids'])) {
        $qb
            ->leftJoin('cer.categories', 'cs')
            ->andWhere($qb->expr()->in('cs.id', $params['category_ids']))
        ;
    }

    return $qb;
}

/**
 * extractQuery
 *
 * @param array $params
 * @return Query
 */
public function extractQuery($params)
{
    $qb = $this->extractQueryBuilder($params);

    return is_null($qb) ? $qb : $qb->getQuery();
}

/**
 * extract
 *
 * @param array $params
 * @return DoctrineCollection
 */
public function extract($params)
{
    $q = $this->extractQuery($params);

    return is_null($q) ? array() : $q->getResult();
}

现在您可以像这样查询实体

http://mydomaine/api/query?entityReference=my_entity_reference&format=xml

http://mydomaine/api/my_entity_reference.xml