fidesio/annotation-aware-hydrator

支持注解的PHP hydrator/extractor。

dev-master 2014-11-03 11:01 UTC

This package is not auto-updated.

Last update: 2024-09-24 08:12:35 UTC


README

#注解感知Hydrator 一个用于将PHP对象转换为数组的hydrator/extract,它通过注解使用过滤器和管理器。

##是什么? 将数组转换为对象(hydrating)和对象转换为数组(extracting)。在只选择所需的属性/值的同时忽略其他部分。

##为什么? 因为将信息保留在对象中而不是在服务中的某个地方编写逻辑会更好。就像Doctrine使用 @Column 来指示属性必须写入数据库一样。这个库使用 @Extract 和 @Hydrate 来指示你想要将属性hydrated或extracted。

##安装 此包尚未提交到 packagist.org(尚未)。你可以使用以下步骤通过composer加载它:https://composer.php.ac.cn/doc/05-repositories.md#loading-a-package-from-a-vcs-repository 包名是:"flip111/annotation-aware-hydrator"

##如何?

将注解添加到你的对象属性中。

<?php
namespace My\Nice\Name\space;

use flip111\AnnotationAwareHydrator\Annotation\Hydrate;
use flip111\AnnotationAwareHydrator\Annotation\Extract;

class MyObject {
	/**
	 * @Extract
	 */
	public $prop1;

	/**
	 * @Hydrate
	 */
	public $prop2;
}

###提取

<?php
namespace My\Nice\Name\space;

use flip111\AnnotationAwareHydrator\Hydrator\AnnotationAwareHydrator;

$hydrator = new AnnotationAwareHydrator();

$original = new MyObject;
$original->prop1 = 'First';
$original->prop2 = 'Second';

$array = $hydrator->extract($original);

var_dump($array);

输出

array (size=1)
  'prop1' => string 'First' (length=5)

###hydrating

<?php
namespace My\Nice\Name\space;

use flip111\AnnotationAwareHydrator\Hydrator\AnnotationAwareHydrator;

$hydrator = new AnnotationAwareHydrator();

$array2 = [
	'prop1' => 'First',
	'prop2' => 'Second'
];

// You can also pass in the $original instead of new MyObject
// this is just for reading the annotations.
$object = $hydrator->hydrate($array2, new MyObject);

var_dump($object);

输出

object(My\Nice\Name\space\MyObject)[983]
  public 'prop1' => null
  public 'prop2' => string 'Second' (length=6)

##功能

###1. 使用反射,因此你可以使用受保护和私有属性。

###2. 允许你在hydrating/extracting时修改值 示例对象

<?php
namespace My\Nice\Name\space;

use flip111\AnnotationAwareHydrator\Annotation\Extract;
use My\Nice\Name\space\Modifier\PastryModifier;

class MyObject {
	/**
	 * @Extract(modifier=@PastryModifier)
	 */
	public $prop1;
}

你必须编写自己的修改器,这非常简单。有两种类型的修改器。一种定义了hydrating和extracting,这对于双向转换非常有用(请参阅示例文件夹中的AbstractTwoWayModifier)。另一种仅定义修改动作,下面将提供一个示例。

<?php
namespace My\Nice\Name\space\annotation;

use flip111\AnnotationAwareHydrator\Modifier\AbstractOneWayModifier;

/**
 * @Annotation
 * @Target({"ANNOTATION"})
 */
class PastryModifier extends AbstractOneWayModifier {
  public function modify($value) {
    return str_replace('cake', 'cookie', $value);
  }
}

示例

<?php
$object->prop1 = 'Peter Griffin ate a cake.';
$array = $hydrator->extract($object);

结果

$array == [
	'prop1' => 'Peter Griffin ate a cookie.'
]

###3. 过滤值。preFilters值用于在修改器之前应用过滤器,postFilters用于之后。这在更改数据类型时特别有用。示例对象

<?php
namespace My\Nice\Name\space;

use flip111\AnnotationAwareHydrator\Annotation\Extract;
use My\Nice\Name\space\Modifier\PastryModifier;
use My\Nice\Name\space\Filter\PeterFilter;

class MyObject {
	/**
	 * @Extract(preFilters={@PeterFilter}, modifier=@PastryModifier)
	 */
	public $prop1;
	
	/**
	 * @Extract(preFilters={@PeterFilter}, modifier=@PastryModifier)
	 */
	public $prop2;
}
<?php
namespace My\Nice\Name\space\Filter;

use Zend\Stdlib\Hydrator\Filter\FilterInterface;

/**
 * @Annotation
 * @Target({"ANNOTATION"})
 */
class DummyFilter implements FilterInterface {
  public function filter($value) {
    return ! strpos($value, 'Peter'); // Filter out all Peter's !!
  }
}

示例

<?php
$object->prop1 = 'Peter Griffin ate a cake.';
$object->prop2 = 'And Stewie ate a cake too.';
$array = $hydrator->extract($object);

结果

$array == [
	'prop2' => 'And Stewie ate a cookie too.'
]