anh / doctrine-extensions-resource
管理资源的Doctrine扩展
Requires
- php: >=5.4
- doctrine/common: ~2.2
- symfony/event-dispatcher: ~2.4
Requires (Dev)
- anh/paginator: 0.2.*
- doctrine/mongodb-odm: 1.0.x-dev
- doctrine/orm: ~2.4
- doctrine/phpcr-odm: ~1.0
- jackalope/jackalope: ~1.0
- jackalope/jackalope-doctrine-dbal: ~1.0
- phpspec/phpspec: ~2.2,<2.3
README
扩展提供了简化且统一的接口来处理资源。
安装
$ php composer.phar require 'anh/doctrine-extensions-resource:0.4.*'
Symfony集成
使用方法
定义资源
资源定义是一个包含必选和可选键的数组。
$resources = [ 'article' => [ // resource name 'model' => 'Some\Name\Space\Entity\Article', // model (required) 'repository' => 'Some\Other\Name\Space\Repository', // you can override resource repository here (optional) 'interface' => 'Another\Lib\Interface', // for Doctrine ResolveTargetEntityListener (optional, can be array, not implemented yet) 'rules' => [ // rules for this resource (optional) 'isPublished' => [ 'isDraft' => false, 'r.publishedSince <= current_timestamp()', ], ], ], 'category' => [ // another resource /* ... */ ], ];
初始化
您应该配置对象管理器,以便使用ResourceRepositoryFactory
作为存储库工厂,以便将分页器和规则解析器服务注入到存储库中。扩展可以使用任何与ResourcePaginatorInterface
兼容的分页器。
创建实体管理器、事件分发器、添加事件订阅者并创建ResourceManagerFactory
。
<?php use Doctrine\ORM\Configuration; use Doctrine\ORM\EntityManager; use Anh\DoctrineResource\ORM\ResourceRepositoryFactory; use Anh\DoctrineResource\ORM\EventListener\LoadMetadataSubscriber; use Anh\Paginator\Paginator; $repositoryFactory = new ResourceRepositoryFactory($resources, new Paginator()); // create config for object manager $config = new Configuration(); /* set up orm config here */ $config->setRepositoryFactory($repositoryFactory); // create entity manager $entityManager = EntityManager::create([/* connection params */], $config); // create event dispatcher $eventDispatcher = new EventDispatcher(); /* set up event dispatcher here */ // add doctrine event subscriber $entityManager->getEventManager()->addEventSubscriber(new LoadMetadataSubscriber($resources)); // create factory for resource manager $resourceManagerFactory = new ResourceManagerFactory($resources, $eventDispatcher);
使用ResourceManager
进行CRUD操作。
每种资源类型都有自己的资源管理器,要实例化它,您应该使用ResourceManagerFactory::create()
。
$articleManager = $resourceManagerFactory->create('article', $entityManager); // basic CRUD operations // create resource $article = $articleManager->createResource(); $article->setTitle('This is so test title'); $articleManager->create($article); // update resource $article->setTitle('This is test title'); $articleManager->update($article); // delete resource $articleManager->delete($article);
事件
上述代码将生成以下事件
- anh_resource.article.pre_create
- anh_resource.article.post_create
- anh_resource.article.pre_update
- anh_resource.article.post_update
- anh_resource.article.pre_delete
- anh_resource.article.post_delete
使用ResourceRepository
检索资源。
ResourceRepository
有两个用于检索资源的方法:paginate()
和fetch()
。
// resource repository usage $articleRepository = $articleManager->getRepository(); // paginate published articles $publishedArticles = $articleRepository->paginate(1, 20, ['[isPublished]']); // fetch articles with complex criteria $ratedArticles = $articleRepository->fetch( [ // criteria '%rating' => [ '>' => 10 ], '[isPublished]', ], [ // sorting 'rating' => 'desc' ], 5 // limit );
高级条件格式
您可以使用高级条件格式进行过滤。它不仅限于相等比较。例如
$criteria = [ 'section' => 'articles', // old school '%rating' => [ '>' => 10 ], '#or' => [ '%title-1' => [ 'like' => '%word.' ], '%title-2' => [ 'like' => 'Some%' ], '#and' => [ 'role' => [ 'moderator', 'editor' ], '#or' => [ 'status' => 'fixed', 'isDraft' => true, ], ], ], ];
高级比较
如果字段名称以%
开头,则应遵循字段的先进格式。它由包含单个元素的数组组成,其中键是比较运算符,值是运算符的参数。常见的运算符有:>
、<
、>=
、<=
、<>
和其他,对于完整列表,请参阅每个驱动程序的QueryBuilderAdapter
。
比较类型
符号#
后面跟着and
或or
用于更改比较类型。比较类型可以嵌套。
同一字段上的多个条件
如果您需要同一字段的多个条件,只需添加一个连字符后跟一个数字即可。对于比较类型也适用相同的规则。
规则
规则是资源预定义的条件组。您可以在资源定义(键rules
)中定义它。规则定义后,您可以使用其名称(用方括号括起来)作为ResourceRepository::paginate()
和ResourceRepository::fetch()
方法的条件。
$repository = $manager->getRepository(); $publishedArticlesInSection = $repository->fetch([ '[isPublished]', 'section' => $section ]);
自动连接
查询构建器自动添加内部连接...(待完善)
$criteria = [ 'user.email' => $email, '%user.role' => [ 'in' => ['guest', 'anonymous'] ], ]; $sorting = [ 'user.createdAt' => 'desc', ];
此高级条件格式对所有可用的驱动程序(ORM、PHPCR-ODM、MongoDB-ODM)都有效。
注意
并非所有运算符都适用于每个驱动程序。
致谢
受SyliusResourceBundle的启发,该bundle来自Sylius。
版本控制
库使用语义版本控制。
许可
MIT