idci / exporter-bundle
Symfony ExporterBundle
Requires
- php: >=5.3.2
- symfony/framework-bundle: >=2.1
- twig/twig: *
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