kappa/doctrine

用于更好地与 Doctrine 工作的类集合

v2.1.2 2014-07-11 12:48 UTC

This package is auto-updated.

Last update: 2024-09-04 18:23:21 UTC


README

Build Status

Kappa\Doctrine

用于更好地与 Doctrine 工作的类集合

需求

安装

安装 Kappa\Doctrine 的最佳方式是使用 Composer

$ composer require kappa/doctrine:@dev

用法

Converter::entityToArray()

方法 entityToArray 需要实体对象并返回 Kappa\Doctrine\Converters\EntityToArrayConverter

  • setIgnoreList(array) - 设置可以忽略的项目列表 (忽略列表和白名单可以组合使用)
  • setWhiteList(array) - 设置可以转换的项目列表 (忽略列表和白名单可以组合使用)
  • addFieldResolver(column name, resolver) - 您可以为字段设置闭包或具体值
  • convert() - 返回生成的数组

示例

<?php
$user = new User("Joe");
$user->setParent(new User("Joe senior"))
	->setAge(50);
	->setPrivate("private");
$array = $converter->entityToArray($user)
	->setIgnoreList(["private"])
	->addFieldResolver("age", 10)
	->addFieldResolver("parent", function(User $parent) { return $parent->getName(); })
	->convert();
echo $array['name']; // print Joe
echo $array['parent']; // print Joe senior
echo $array['age']; // print 10

Converter::arrayToEntity()

方法 arrayToEntity 需要两个参数。第一个参数可以是实体对象或实体类名称,并返回 Kappa\Doctrine\Converters\ArrayToEntityConverter

  • setIgnoreList(array) - 设置可以忽略的项目列表 (忽略列表和白名单可以组合使用)
  • setWhiteList(array) - 设置可以转换的项目列表 (忽略列表和白名单可以组合使用)
  • addItemResolver(column name, resolver) - 您可以为项目设置闭包或具体值
  • convert() - 返回生成的数组

示例

$data = [
	'name' => 'Joe',
	'age' => 50, 
	'parent' => 1,
	'sex' => 'male',
	'private' => 'text',
];
$entity = $converter->arrayToEntity('User', $data)
	->setIgnoreList(['private'])
	->setWhiteList(['age', 'name', 'private'])
	->setItemResolver('parent', function ($parent) {
		return $this->dao->find($parent);
	})
	->setItemResolver('sex', 'female')
	->convert();
echo $entity->getName(); // print Joe
echo $entity->getSex(); // print female
$entity->getParent(); // returns instance of User

CrudManager

推荐使用 Kappa\Managers\CrudManagerFactory 创建 Kappa\Doctrine\Managers\CrudManager 实例。

<?php
$crudManager = $this->crudManagerFactory->create(new User());
// or
$crudManager = $this->crudManagerFactory->create('Some\Entity\User');

方法 create() 仅需要一个参数,可以是实体实例或完整命名空间名称。

创建的 CrudManager 包含用于基本实体操作的三种方法。

  • create(array) - 创建新实体并填充数据
  • update(id, array) - 通过 id 查找实体并填充数据
  • delete(id) - 删除具有 id 的实体

FormItemsCreator

$form = new Form();
$form->addSelect('parent', 'Parent item: ', $this->formItemsCreator->create('\UserEntity', new GetAll());
// or
$user = new User();
$form->addSelect('parent', 'Parent item: ', $this->formItemsCreator->create($user, new GetAll());
$this->formItemsCreator->create('\UserEntity', new GetAll());

使用默认列 idtitle 并创建类似这样的数组

$array = [
	'1' => 'John'
];

您可以通过配置更改默认列

doctrine:
	forms:
		items:
			identifierColumn: id
			valueColumn: name

或作为第三个和第四个参数

$this->formItemsCreator->create('\UserEntity', new GetAll(), 'name', 'id');

第三个参数是 valueColumn,最后一个参数是 identifierColumn

QueryExecutor

有时需要运行 DQL 查询而不是操作实体。使用 QueryBuilder 构建 UPDATE(或 DELETE)是一种很好的方式。

DoctrineKdyby\Doctrine 中,您可以为此类情况创建 SELECT 查询并使用 $this->repository->fetch(new QueryObject) 运行,但对于 UPDATE 或 DELETE 查询不支持。 QueryExecutor 正好适用于这些情况。

示例

<?php

class ExecutableQuery implements Executable
{
	/**
	 * @param QueryBuilder $queryBuilder
	 * @return QueryBuilder
	 */
	public function build(QueryBuilder $queryBuilder)
	{
		$queryBuilder->update('KappaTests\Mocks\FormItemsEntity', 'r')
			->set('r.title', $queryBuilder->expr()->literal('UPDATED'))
			->where('r.id = ?0')
			->setParameters(1);

		return $queryBuilder;
	}
}

// and

$this->queryExecutor->execute(new ExecutableQuery());

## RouteParamsResolver

You can use `Kappa\Doctrine\Routes\RouteParamsResolver` for easy works with `FILTER_IN/OUT` in your routes

**Example**

```php
<?php

class Router
{
	private $paramsResolver;
	
	public function __construct(RouteParamsResolverFactory $factory)
	{
		$this->paramsResolver = $factory->create('App\Entities\Article');
	}
	
	/**
	 * @return \Nette\Application\IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList();
		$router[] = new Route('<presenter>/<action>[/<id>', [
			'presenter' => 'Homepage',
			'action' => 'default',
			'id' => [
				Route::FILTER_IN => [$this->paramsResolver, 'filterIn'],
				Route::FILTER_IN => [$this->paramsResolver, 'filterOut']
			]
		]);

		return $router;
	}
}