venne/data-transfer

数据传输对象

dev-master / 1.0.x-dev 2014-11-15 08:52 UTC

This package is auto-updated.

Last update: 2024-08-29 04:09:00 UTC


README

在模板中使用 data transfer object 模式。

优点

  • 模板中的简单只读对象。
  • 可缓存的具有所有 Nette/Caching 功能的对象和集合。
  • 可序列化的对象和集合。
  • Kdyby/Doctrine 无缝配合。

安装

安装 Venne/DataTransfer 的最佳方式是使用 Composer

composer require venne/data-transfer:@dev

激活

extensions:
	dataTransfer: Venne\DataTransfer\DI\DataTransferExtension

配置

dataTransfer:
	driver: Venne\Bridges\Kdyby\Doctrine\DataTransfer\EntityDriver
	cache:
		namespace: dataTransfer

用法

定义 DTO

/**
 * @property-read integer $id
 * @property-read string $name
 */
class ArticleDTO extends \Venne\DataTransfer\DataTransferObject {}

基本使用

$article = new ArticleDTO(array(
	'id' => 1,
	'name' => 'fooName',
));

// Lazy mode
$article = new ArticleDTO(function () {
	return array(
		'id' => 1,
		'name' => 'fooName',
	);
});

$article = unserialize(serialize($article)); // it works

echo $article->id;   // 1
echo $article->name; // fooName
echo $article->foo; // throw exception

迭代器

$articles = DataTransferObjectIterator(ArticleDTO::class, array(
	array(
		'id' => 1,
		'name' => 'fooName',
	),
	array(
		'id' => 2,
		'name' => 'barName',
	),
));

// Lazy mode
$articles = DataTransferObjectIterator(ArticleDTO::class, function () {
	return array(
				array(
					'id' => 1,
					'name' => 'fooName',
				),
				array(
					'id' => 2,
					'name' => 'barName',
				),
	);
});

$articles = unserialize(serialize($articles)); // it works

echo count($articles);

foreach ($articles as $article) {
	echo $article->id;
	echo $article->name;
}

数据传输管理器

$dataTransferManager = $container->getByType('Venne\DataTransfer\DataTransferManager');
// $dataTransferManager = new DataTransferManager($driver, $cacheStorage);
$article = $dataTransferManager
	->createQuery(ArticleDTO::class, function () {
		return $this->articleRepository->find($this->id);
	})
	->enableCache($key, $dependencies)
	->fetch();
$articles = $dataTransferManager
	->createQuery(ArticleDTO::class, function () {
		return $this->articleRepository->findBy(array(
			'parent' => $this->id,
		));
	})
	->enableCache($key, $dependencies)
	->fetchAll();

kdyby/doctrine 的协作

安装

extensions:
	...
	kdybyDataTransfer: Venne\Bridges\Kdyby\Doctrine\DataTransfer\DI\DataTransferExtension

用法

$this->template->article = $dataTransferManager
	->createQuery(ArticleDTO::class, function () {
		return $this->articleRepository->find($this->id);
	})
	->enableCache($key, $dependencies)
	->fetch();