fsi/metadata

此包已被 放弃 并不再维护。没有建议替代包。

FSi 元数据组件是一个库,它提供了一些常用的机制来从不同的源(如注解、yaml 或 xml)读取类的配置。

0.9.3 2014-04-28 11:01 UTC

This package is auto-updated.

Last update: 2021-02-10 10:31:27 UTC


README

请不要使用此包,因为它将不会收到任何更新,未来可能会被删除。

FSi 元数据组件文档

FSi 元数据组件是一个库,它提供了一些常用的机制来从不同的源(如注解、yaml 或 xml)读取类的配置。目前只支持 PHP 文件注解。

设置和自动加载

我们强烈建议使用 composer.phar 生成的自动加载器

将反射添加到 composer.json

{
    ... 
    "require": {
        ... 
        "fsi/metadata": "0.9.*" 
        ...
    },
    ...
}

使用方法

FSi 元数据组件提供了可以轻松覆盖的 ClassMetadata 对象。默认的 ClassMetadata 对象允许你在其中存储类的、属性的和方法配置。这可以通过使用 "addClassMetadata"、"addPropertyMetadata"、"addMethodMetadata" 方法来完成。

你需要做的是创建一个扩展抽象驱动程序(如 AbstractAnnotationDriver)之一的类。

从 PHP 类文件中读取注解的示例。

注解驱动程序

namespace FSi\Bundle\SiteBundle\Metadata\Driver;

use FSi\Component\Metadata\ClassMetadataInterface;
use FSi\Component\Metadata\Driver\AbstractAnnotationDriver;

class AnnotationDriver extends AbstractAnnotationDriver
{
    public function loadClassMetadata(ClassMetadataInterface $metadata)
    {
        $classReflection  = $metadata->getClassReflection();
        $className        = $classReflection->getName();

        $classReflectionProperties = $classReflection->getProperties();
        foreach ($classReflectionProperties as $property) {
            if ($property->getDeclaringClass()->getName() == $className) {
                foreach ($this->getAnnotationReader()->getPropertyAnnotations($property) as $element) {
                    $metadata->addPropertyMetadata($property->name, $element->name, $element->value);
                }
            }
        }
    }
}

注解声明

namespace FSi\Bundle\SiteBundle\Metadata\Mapping\Annotation;

use Doctrine\Common\Annotations\Annotation;

/** @Annotation */
final class Field extends Annotation {
    public $name;
    public $value;
}

在 symfony 2 控制器中的示例动作

    public function metadataAction()
    {
        $driver = new \FSi\Bundle\SiteBundle\Metadata\Driver\AnnotationDriver($this->get('annotation_reader'));
        
        $factory = new MetadataFactory($driver);
        
        $metdata = $factory->getClassMetadata('FSi\Bundle\SiteBundle\Entity\MetaTest');
    }

在 symfony 2 控制器中的示例动作(带缓存)

要实现元数据缓存,你需要从 Doctrine\Common\Cache 创建缓存对象,并将其传递给 MetadataFactory 构造函数。出于开发目的,我们建议使用 ArrayCache 而不是不使用任何缓存。

public function metadataAction()
{
    $cache = new Doctrine\Common\Cache\ApcCache(); 
    
    $driver = new \FSi\Bundle\SiteBundle\Metadata\Driver\AnnotationDriver($this->get('annotation_reader'));
    
    // the third parameter should be used when one cache instance will be used in many metadata factories. 
    $factory = new MetadataFactory($driver, $cache, 'cache-prefix');
    
    $metdata = $factory->getClassMetadata('FSi\Bundle\SiteBundle\Entity\MetaTest');
}

有时默认的 ClassMetadata 不足以满足需求。你可以创建一个实现 ClassMetadataInterface 的自定义类,并将类名作为第三个参数传递给 MetadataFactory 构造函数。

带有自定义元数据类的工厂构造函数示例

$factory = new MetadataFactory($driver, $cache, 'cache-namespace', 'FSi\SiteBundle\Metadata\MyClassMetadata');

如果你想在同一应用程序的两个不同的机制中使用元数据组件,你应该为每个机制创建一个新的 MetatadaFactory 和适当的驱动程序,但缓存驱动程序可以是相同的对象。这是可能的,当使用不同的前缀和/或元数据类为每个工厂对象时,缓存机制被使用。