juliangut / doctrine-base-repositories
Doctrine2 实用仓库
Requires
- php: ^7.0
- doctrine/common: ^2.0
- doctrine/inflector: ^1.0
- symfony/polyfill-php71: ^1.0
- zendframework/zend-paginator: ^2.6
Requires (Dev)
- brainmaestro/composer-git-hooks: ^2.1
- doctrine/orm: ^2.4
- friendsofphp/php-cs-fixer: ^2.0
- infection/infection: ^0.7.0
- ocramius/package-versions: ~1.2.0
- phpmd/phpmd: ^2.0
- phpmetrics/phpmetrics: ^2.0
- phpstan/phpstan: ~0.8
- phpunit/phpunit: ^6.0
- sebastian/phpcpd: ^2.0
- squizlabs/php_codesniffer: ^2.0
- symfony/console: ^3.0|^4.0
Suggests
- juliangut/doctrine-mongodb-odm-repositories: Doctrine MongoDB repositories
- juliangut/doctrine-orm-repositories: Doctrine ORM repositories
README
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 }
实现
- ORM (关系数据库) 与 doctrine-orm-repositories
- MongoDB 与 doctrine-mongodb-odm-repositories
- CouchDB 与 doctrine-couchdb-odm-repositories (不再维护)
新方法
以下是通过 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 文件。