juliangut/doctrine-base-repositories

1.1.2 2018-06-05 21:24 UTC

This package is auto-updated.

Last update: 2024-09-15 11:31:32 UTC


README

PHP version Latest Version License

Build Status Style Check Code Quality Code Coverage

Total Downloads Monthly Downloads

doctrine-base-repositories

Doctrine2 实用仓库。用作自定义仓库的基础

安装

Composer

composer require juliangut/doctrine-base-repositories

使用

创建实现 Repository 接口的自定义仓库

use Doctrine\ORM\EntityRepository;
use Jgut\Doctrine\Repository\EventsTrait;
use Jgut\Doctrine\Repository\FiltersTrait;
use Jgut\Doctrine\Repository\PaginatorTrait;
use Jgut\Doctrine\Repository\Repository;
use Jgut\Doctrine\Repository\RepositoryTrait;

class customRepository extends EntityRepository implements Repository
{
    use RepositoryTrait;
    use EventsTrait;
    use FiltersTrait;
    use PaginatorTrait;

    protected function getFilterCollection()
    {
        // Custom implementation
    }

    public function countBy($criteria)
    {
        // Custom implementation
    }

    public function findPaginatedBy($criteria, array $orderBy = [], $itemsPerPage = 10)
    {
        // Custom implementation
    }

    protected function getManager()
    {
        // Custom implementation
    }

    // Custom methods
}

实现

新方法

以下是通过 RepositoryTrait 带来的新方法,由 juliangut/doctrine-base-repositories 提供

查找或失败

与 findBy, findOneBy 及其 "魔法" 组合相同的函数,但如果没有找到任何内容则抛出异常

$repository = $manager->getRepository(ObjectClass::class);

$object = $repository->findByOrFail(['slug' => 'my_slug']);
$object = $repository->findBySlugOrFail('my_slug');
$object = $repository->findOneByOrFail(['slug' => 'my_slug']);
$object = $repository->findOneBySlugOrFail('my_slug');

创建

getNew

直接从仓库创建一个新空对象。

$repository = $manager->getRepository(ObjectClass::class);

$newObject = $repository->getNew();

findOneByOrGetNew

根据条件返回一个对象或找不到时返回一个新空对象。

$repository = $manager->getRepository(ObjectClass::class);

$existingOrNewObject = $repository->findOneByOrGetNew(['slug' => 'my_slug']);

添加

add

将实体持久化到管理器。

$repository = $manager->getRepository(ObjectClass::class);

$repository->add(new ObjectClass());

移除

remove

add 类似,这将移除实体。

$repository = $manager->getRepository(ObjectClass::class);

$managedObject = $repository->findById(1);

$repository->remove($managedObject);

removeAll

查找所有然后全部移除。

$repository = $manager->getRepository(ObjectClass::class);

$repository->removeAll();

removeBy 和 removeOneBy

与 findBy 和 findOneBy 功能相同,但移除对象而不是返回它们。

$repository = $manager->getRepository(ObjectClass::class);

$repository->removeBy(['active' => false]);
$repository->removeByActive(false);
$repository->removeOneBy(['id' => 1]);
$repository->removeOneById(1);

计数

countAll 和 countBy

执行对象计数

$repository = $manager->getRepository(ObjectClass::class);

$totalObjects = $repository->countAll();
$activeObjects = $repository->countBy(['active' => true]);
$activeObjects = $repository->countByActive(true);

countBy 方法需要在自定义仓库中实现

事件管理

在管理器的事件管理器上通常有事件订阅者。这通常是因为使用了 Doctrine 扩展,在生命周期的某些点上添加了额外的行为。例如 gedmo/doctrine-extensions

事件管理由 EventsTrait 提供

禁用事件订阅者

您可能想暂时禁用一个事件订阅者。

$repository = $manager->getRepository(ObjectClass::class);

$repository->disableEventSubscriber(\Gedmo\Timestampable\TimestampableListener::class);
$repository->save(new EntityClass());
$repository->restoreEventSubscribers();

禁用事件监听器

您可能想禁用特定事件的全部监听器。

$repository = $manager->getRepository(ObjectClass::class);

$repository->disableEventListeners('onFlush');
$repository->save(new EntityClass());
$repository->restoreEventListeners('onFlush');
// $repository->restoreAllEventListener();

禁用单个事件监听器

您可能只想禁用某些监听器,而不是禁用注册为事件的全部监听器。

$repository = $manager->getRepository(ObjectClass::class);

$repository->disableEventListener('onFlush', \Gedmo\Loggable/LoggableListener::class);
$repository->save(new EntityClass());
$repository->restoreEventListener('onFlush');
// $repository->restoreAllEventListener();

过滤器管理

过滤器管理由 FiltersTrait 提供

禁用过滤器

您可能想暂时禁用所有过滤器。

$repository = $manager->getRepository(ObjectClass::class);

$repository->disableFilters();
$repository->save(new EntityClass());
$repository->restoreFilters();

禁用单个过滤器

您可能想禁用单个过滤器。

$repository = $manager->getRepository(ObjectClass::class);

$repository->disableFilter('locale');
$repository->save(new EntityClass());
$repository->restoreFilter('locale');
// $repository->restoreFilters();

需要自定义仓库中实现 getFilterCollection 方法

分页

返回与 findBy 相同的结果,但包含在 \Zend\Paginator\Paginator 对象中,具有分页信息,还有一个抛出异常的版本。由 PaginatorTrait 提供

$repository = $manager->getRepository(ObjectClass::class);

$paginator = $repository->findPaginatedBy(['active' => true], ['date' => 'ASC'], 10);
$paginator = $repository->findPaginatedByActive(true, ['date' => 'ASC'], 10);

// Assuming there are 80 "active"
$paginator->getTotalItemCount(); // 80
$paginator->getCurrentItemCount(); // 10
$paginator->getCurrentPageNumber(); // 1
...

$paginator = $repository->findPaginatedByOrFail(['active' => true], ['date' => 'ASC'], 10);

findPaginatedBy 方法需要在自定义仓库中实现

贡献

发现了一个错误或有一个功能请求?请 创建一个新的问题。在提交之前查看现有的问题。

请参阅 CONTRIBUTING.md 文件

许可

有关许可条款的副本,请参阅源代码中包含的 LICENSE 文件。