visualmedia/data_extract_bundle

Symfony2 扩展包,帮助扩展 Bundles

1.0.2 2016-01-11 15:50 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:46:10 UTC


README

Symfony2 Bundle,用于从实体中提取(元)数据。可以使用注解从 Doctrine 实体中提取数据,可以使用标记服务提取其他对象的数据。在解析实体和标记服务时,会构建一个字典,可以用来通知用户哪些数据可用。

作者

此 Symfony2 Bundle 由荷兰的网站开发、网站设计和互联网营销公司 VisualMedia 免费提供。

功能概述

  • 使用注解配置可用数据
  • 标记服务接口用于额外(未注解)数据
  • 可用数据字典

要求

  • PHP 5.4+
  • Symfony v2.4+
  • Doctrine ORM v1.2+
  • Doctrine Bundle v2.4+

用例

每个应用程序中的内容都包含有价值的信息,这些信息可用于(元)标签、搜索索引器等。这些信息可以嵌入程序代码中,但这阻止了市场人员在不接触开发人员的情况下使用这些信息。在我们的应用程序中,我们使用一种易于使用的表达式语言,它可以访问提取的数据,使市场人员能够根据应用程序中包含的信息创建新的和动态的标签。字典显示了哪些信息可用。

设计考虑

无元数据继承

在扫描可用的(元)数据时,只考虑实体类,这是按设计进行的,以防止对不相关数据的不当继承。将来可以添加新的注解,以指示系统应扫描注解的深度

仅基于注解

目前,仅使用注解来提供(元)数据配置,这是由于 VisualMedia 使用注解来配置列等。可以实现 XML 和/或 YAML 配置文件。

无全局(元)数据

该扩展包仅从对象中提取(元)数据,没有提供全局(元)数据的方式,例如分析代码等。这是按设计进行的,因为这是一个全新的用例。

安装

将以下依赖项添加到您的项目 composer.json 文件中

"require": {
    # ..
    "visualmedia/data_extract_bundle": "~1.0"
    # ..
}

在 AppKernel 中启用 VisualMDataExtractBundle

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new VisualM\DataExtractBundle\VisualMDataExtractBundle(),
    );
}

用法

向 Doctrine 实体添加注解

通过这些注解,Bundle(DictionaryCollector)可以扫描 Doctrine 实体中可用的(元)数据

<?php

use VisualM\DataExtractBundle\Annotation\DataElement;

// ...

/** 
 * @ORM\Entity()
 * 
 * @DataElement(fields="title, page.title", getter="getTitle")
 * @DataElement(fields="meta_description, page.meta_description", getter="getMetaDescription")
 * @DataElement(fields="page.changed", getter="getChanged", type="datetime")
 * @DataElement(fields="page.changed", getter="getChangedFormatted")
 */
class Page
{

// ...

使用 DictionaryCollector 列出可用字段

使用 DictionaryCollector,可以列出实体和数据提供者提供的所有字段(请参阅高级用法部分)。此列表可用于显示用户可用字段的列表。

<?php

$dictionary_collector = $this->container->get('visualm.data.dictionary_collector');

// List all available field	
var_dump($dict_collector->getAvailableFields());

// Returns:
//
// array
//   0 => string 'meta_description'
//   1 => string 'title'
//   2 => string 'page.changed'
//   3 => string 'page.meta_description'
//   4 => string 'page.title'

// List fields of specific type(s)
var_dump($dict_collector->getAvailableFields([ TypeEnum::DATETIME ]));

// Returns:
//
// array
//   0 => string 'page.changed'

获取特定对象/实体的(元)数据

使用 DataCollector 可以从特定对象/实体中提取数据,而无需将其存储在 DataCollector 中。在检索(元)数据时,可以指定哪些数据可以处理(默认为仅 STRING)。当指定多个类型时,顺序决定了在存在多种数据类型时返回哪种数据

<?php

$page = $page_repository->getPageBySlug('test');

$data_collector = $this->get('visualm.data.data_collector');

// Get all data from single entity of type DATETIME and STRING, prevering DATETIME
$data = $data_collector->getForSingleObject($page, [ TypeEnum::DATETIME, TypeEnum::STRING ]);
var_dump($data);

// Returns:
// array
//   'title' => string 'Test'
//   'page' => 
//     array
//       'title' => string 'Test'
//       'changed' => 
//         object(DateTime)[617]
//           public 'date' => string '2014-08-01 12:00:00'
//           public 'timezone_type' => int 3
//           public 'timezone' => string 'Europe/Berlin'

// Get all data from single entity of type DATETIME and STRING, prevering STRING
$data = $data_collector->getForSingleObject($page, [ TypeEnum::STRING, TypeEnum::DATETIME ]);
var_dump($data);

// Returns:
// array
//   'title' => string 'Test'
//   'page' => 
//     array
//       'title' => string 'Test'
//       'changed' => string '2014-08-01 12:00:00'

获取多个对象/实体的(元)数据

使用DataCollector可以从多个对象/实体中提取数据,DataCollector会记住从不同对象中提取了哪些数据,并允许收集一个聚合集。在检索(元)数据时,可以指明哪些数据可以被处理(默认仅支持STRING)。当指明多个类型时,顺序决定了在存在多种数据类型时返回哪种数据。

<?php

$page = $page_repository->getPageBySlug('test');
$page2 = $page_repository->getPageBySlug('test2');	

$data_collector = $this->get('visualm.data.data_collector');

// Push objects into collector
$data_collector->pushObject($page);
$data_collector->pushObject($page2);

// Get all collected data of type DATETIME and STRING, prevering DATETIME
$data = $data_collector->getCollected($page, [ TypeEnum::DATETIME, TypeEnum::STRING ]);
var_dump($data);

// Returns:
// array
//   'title' => string 'Test2'
//   'page' => 
//     array
//       'title' => string 'Test2'
//       'changed' => 
//         object(DateTime)[617]
//           public 'date' => string '2014-08-01 12:00:00'
//           public 'timezone_type' => int 3
//           public 'timezone' => string 'Europe/Berlin'

// Get all collected data of type DATETIME and STRING, prevering STRING
$data = $data_collector->getCollected($page, [ TypeEnum::STRING, TypeEnum::DATETIME ]);
var_dump($data);

// Returns:
// array
//   'title' => string 'Test2'
//   'page' => 
//     array
//       'title' => string 'Test2'
//       'changed' => string '2014-08-01 12:00:00'

高级用法

DataProviderInterface

DataProvider可以用来从无法使用注解系统提供的对象中提取数据,例如,因为它使用实体内部不可用的服务(如路由)。

创建DataProvider类

DataProvider必须实现DataProviderInterface。该接口需要两个函数,第一个函数getProvidedFields()告诉DictionaryCollector它提供了哪些字段。第二个函数extractData($object)负责从对象中提取数据。该函数负责检查是否可以处理对象(例如使用instanceOf)。

<?php

use VisualM\DataExtractBundle\Data\CollectedData;
use VisualM\DataExtractBundle\Data\ProvidedField;
use VisualM\DataExtractBundle\Data\TypeEnum;
use VisualM\DataExtractBundle\Provider\DataProviderInterface;

// ...

class SlugDataProvider implements DataProviderInterface
{
    /*
     * {@inheritDoc}
     */
    public function extractData($object)
    {
        if ($object instanceof Page) {            
            return [
                (new CollectedData('slug'))->addData(TypeEnum::STRING, $object->getSlug()),
                (new CollectedData('page.slug'))->addData(TypeEnum::STRING, $object->getSlug())
            ];
        }        
        return [];
    }

    /*
     * {@inheritDoc}
     */	
    public function getProvidedFields()
    {
        return [
            new ProvidedField('slug', TypeEnum::STRING),
            new ProvidedField('page.slug', TypeEnum::STRING)
        ];
    }

}

将DataProvider作为标记服务添加到容器中

Bundle会扫描带有visualm.data.data_provider标记的服务,并将其自动注册到DictionaryCollector以供使用。当使用标记时,可选属性cacheable指示getProvidedFields()返回的字段是否可缓存,默认为true。

# ... 
services:	
# ... 
    project.slug_data_provider:
        class: '...\...\SlugDataProvider'
        tags:
            - { name: visualm.data.data_provider, cachable : true }
# ...