kappa / doctrine
用于更好地与 Doctrine 工作的类集合
v2.1.2
2014-07-11 12:48 UTC
Requires
- php: >= 5.3.0
- kdyby/doctrine: ~2.0
- nette/di: ~2.2
Requires (Dev)
- kappa/tester: ~1.1
README
Kappa\Doctrine
用于更好地与 Doctrine 工作的类集合
需求
- PHP 5.4 或更高版本
- Doctrine 2
- Nette 框架
- Kdyby\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());
使用默认列 id
和 title
并创建类似这样的数组
$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)是一种很好的方式。
在 Doctrine 和 Kdyby\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; } }