ashleydawson / class-meta
通过注解为类及其常量添加任意元数据
2.0.0
2019-02-13 15:29 UTC
Requires
- php: >=7.1
- doctrine/annotations: ^1.2
- doctrine/cache: ^1.6
Requires (Dev)
- phpunit/phpunit: ^4.0
README
通过注解将元数据应用于类及其常量。如果您需要将任意数据附加到查找、枚举等,这将非常有用。
安装
使用以下命令通过Composer安装ClassMeta
$ composer require ashleydawson/class-meta
基本用法
将元数据注解应用于类和常量
<?php namespace Acme\Enum; use AshleyDawson\ClassMeta\Annotation\Meta; /** * @Meta(data={"name"="Invoice Status Types"}) */ class InvoiceStatus { /** * @Meta(data={"name"="Draft", "description"="Invoice has not yet been sent to the customer"}) */ const DRAFT = 'draft'; /** * @Meta(data={"name"="Sent", "description"="Invoice has been sent to the customer"}) */ const SENT = 'sent'; /** * @Meta(data={"name"="Paid", "description"="Invoice has been paid by the customer"}) */ const PAID = 'paid'; /** * @Meta(data={"name"="Void", "description"="Invoice is void and no longer billable"}) */ const VOID = 'void'; }
现在您可以使用类元数据管理器访问元数据
use AshleyDawson\ClassMeta\ClassMetaManager; use AshleyDawson\ClassMeta\Annotation\Meta; $manager = new ClassMetaManager(); $classMeta = $manager->getClassMeta('Acme\Enum\InvoiceStatus'); // "Invoice Status Types" will be echoed echo $classMeta->data['name'];
获取常量元数据
$constantsMeta = $manager->getClassConstantsMeta('Acme\Enum\InvoiceStatus'); // Echo all constant metadata foreach ($constantsMeta as $meta) { echo $meta->data['name'] . PHP_EOL; echo $meta->data['description'] . PHP_EOL; }
通过值(即常量的值)获取单个元数据
$meta = $manager->getClassConstantMetaByValue('Acme\Enum\InvoiceStatus', InvoiceStatus::PAID); // "Paid" will be echoed echo $meta->data['name'];
将常量元数据集合映射到用于选择下拉菜单等用途
$options = $manager->getMappedClassConstantsMeta('Acme\Enum\InvoiceStatus', function (Meta $meta, $i) { // Return items indexed by class constant value return [ $meta->value, $meta->data['name'], ]; // OR // Return items indexed by an incremental integer, starting at zero return [ $i, $meta->data['name'], ]; }); echo '<select>'; foreach ($options as $value => $name) { echo "<option value=\"{$value}\">{$name}</option>"; } echo '</select>';
注意:传递给map闭包的可选参数$i是迭代次数(从0开始)。如果您想将映射集合索引化而不是作为关联数组返回,这很有用。
分组元数据
传递可选的任意分组以帮助组织您的元数据
<?php namespace Acme\Enum; use AshleyDawson\ClassMeta\Annotation\Meta; /** * @Meta(data={"name"="Invoice Status Types"}) */ class InvoiceStatus { /** * @Meta(data={"name"="Draft"}, groups={"admin"}) */ const DRAFT = 'draft'; /** * @Meta(data={"name"="Sent"}, groups={"admin"}) */ const SENT = 'sent'; /** * @Meta(data={"name"="Paid"}) */ const PAID = 'paid'; /** * @Meta(data={"name"="Void"}, groups={"admin"}) */ const VOID = 'void'; }
现在您可以如此访问元数据组
use AshleyDawson\ClassMeta\ClassMetaManager; $manager = new ClassMetaManager(); $constantsMeta = $manager->getClassConstantsMeta('Acme\Enum\InvoiceStatus', ['admin']); // Echo only constant metadata in "admin" group foreach ($constantsMeta as $meta) { echo $meta->data['name'] . PHP_EOL; } $constantsMeta = $manager->getClassConstantsMeta('Acme\Enum\InvoiceStatus', ['Default']); // Echo only constant metadata in "Default" group (i.e. `const PAID = 'paid'` metadata) foreach ($constantsMeta as $meta) { echo $meta->data['name'] . PHP_EOL; } $constantsMeta = $manager->getClassConstantsMeta('Acme\Enum\InvoiceStatus', ['Default', 'admin']); // Echo all constant metadata foreach ($constantsMeta as $meta) { echo $meta->data['name'] . PHP_EOL; }
注意:“默认”组将包含未分配分组的元数据
如果您需要获取所有常量的元数据,即使它们已分配了组,请使用特殊组名_all
,如下所示
$constantsMeta = $manager->getClassConstantsMeta('Acme\Enum\InvoiceStatus', ['_all']);
缓存
可以通过将有效的Doctrine缓存提供者传递给类元数据管理器来缓存所有元数据
use Doctrine\Common\Cache\FilesystemCache; $manager = new ClassMetaManager(); $manager->setCache(new FilesystemCache('/path/to/cache/dir'));
使用类文件修改时间来使缓存失效,但您也可以将可选的TTL(以秒为单位)传递给ClassMetaManager#setCache()
方法
use Doctrine\Common\Cache\FilesystemCache; $manager = new ClassMetaManager(); $manager->setCache(new FilesystemCache('/path/to/cache/dir'), 300); // Cache stale after 5 minutes
测试
要运行ClassMeta测试套件,安装Composer开发依赖项并运行
$ bin/phpunit