fsi / metadata
FSi 元数据组件是一个库,它提供了一些常用的机制来从不同的源(如注解、yaml 或 xml)读取类的配置。
Requires
- php: >=5.3.2
- doctrine/common: ~2.2
Requires (Dev)
- phpunit/phpunit: 3.7.*
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
和适当的驱动程序,但缓存驱动程序可以是相同的对象。这是可能的,当使用不同的前缀和/或元数据类为每个工厂对象时,缓存机制被使用。