visualmedia / data_extract_bundle
Symfony2 扩展包,帮助扩展 Bundles
Requires
- php: >=5.4.0
- doctrine/doctrine-bundle: ~1.2
- symfony/symfony: ~2.4|~3.0
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 }
# ...