anh/doctrine-extensions-resource

管理资源的Doctrine扩展

v0.4.4 2015-04-29 09:21 UTC

This package is auto-updated.

Last update: 2024-09-06 08:49:22 UTC


README

Build Status Scrutinizer Code Quality SensioLabsInsight

扩展提供了简化且统一的接口来处理资源。

安装

$ php composer.phar require 'anh/doctrine-extensions-resource:0.4.*'

Symfony集成

有一个bundlepackage

使用方法

定义资源

资源定义是一个包含必选和可选键的数组。

$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
);

orm-example.php

高级条件格式

您可以使用高级条件格式进行过滤。它不仅限于相等比较。例如

$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

比较类型

符号#后面跟着andor用于更改比较类型。比较类型可以嵌套。

同一字段上的多个条件

如果您需要同一字段的多个条件,只需添加一个连字符后跟一个数字即可。对于比较类型也适用相同的规则。

规则

规则是资源预定义的条件组。您可以在资源定义(键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