juliangut / doctrine-base-repositories
Doctrine2 utility repositories
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 utility repositories. Use as a base for custom repositories
Installation
Composer
composer require juliangut/doctrine-base-repositories
Use
Create your custom repository implementing Repository interface
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 }
Implementations
- ORM (Relational databases) with doctrine-orm-repositories
- MongoDB with doctrine-mongodb-odm-repositories
- CouchDB with doctrine-couchdb-odm-repositories (not maintained)
New methods
These are the new methods that juliangut/doctrine-base-repositories
brings to the table thanks to RepositoryTrait
Find or fail
Same functionality as findBy, findOneBy and their "magic" combinations but throwing an exception if nothing is found
$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');
Creating
getNew
Creates a new empty object directly from repository.
$repository = $manager->getRepository(ObjectClass::class); $newObject = $repository->getNew();
findOneByOrGetNew
Returns an object based on criteria or a new empty object if could not be found
$repository = $manager->getRepository(ObjectClass::class); $existingOrNewObject = $repository->findOneByOrGetNew(['slug' => 'my_slug']);
Adding
add
Will persist the entity into the manager.
$repository = $manager->getRepository(ObjectClass::class); $repository->add(new ObjectClass());
Removing
remove
In the same fashion as add
this will remove the entity.
$repository = $manager->getRepository(ObjectClass::class); $managedObject = $repository->findById(1); $repository->remove($managedObject);
removeAll
FindAll and then removes them all.
$repository = $manager->getRepository(ObjectClass::class); $repository->removeAll();
removeBy and removeOneBy
As their counter parts findBy and findOneBy but removing the objects instead of returning them.
$repository = $manager->getRepository(ObjectClass::class); $repository->removeBy(['active' => false]); $repository->removeByActive(false); $repository->removeOneBy(['id' => 1]); $repository->removeOneById(1);
Counting
countAll and countBy
Perform object count
$repository = $manager->getRepository(ObjectClass::class); $totalObjects = $repository->countAll(); $activeObjects = $repository->countBy(['active' => true]); $activeObjects = $repository->countByActive(true);
countBy method needs implementation on custom repository
Events managing
It is common to have event subscribers on manager's event manager. This is usually due to the use of Doctrine extensions that add extra behaviour in certain points of the lifecycle. gedmo/doctrine-extensions is an example of such behaviours.
Events managing is provided by EventsTrait
Disabling event subscribers
You might want to temporarily disable an event subscriber.
$repository = $manager->getRepository(ObjectClass::class); $repository->disableEventSubscriber(\Gedmo\Timestampable\TimestampableListener::class); $repository->save(new EntityClass()); $repository->restoreEventSubscribers();
Disabling an event listeners
You might want to disable all listeners on a certain event.
$repository = $manager->getRepository(ObjectClass::class); $repository->disableEventListeners('onFlush'); $repository->save(new EntityClass()); $repository->restoreEventListeners('onFlush'); // $repository->restoreAllEventListener();
Disabling single event listeners
You might want to disable certain listeners and not all listeners registered for an event.
$repository = $manager->getRepository(ObjectClass::class); $repository->disableEventListener('onFlush', \Gedmo\Loggable/LoggableListener::class); $repository->save(new EntityClass()); $repository->restoreEventListener('onFlush'); // $repository->restoreAllEventListener();
Filters managing
Filters managing is provided by FiltersTrait
Disabling filters
You might want to temporarily disable all filters.
$repository = $manager->getRepository(ObjectClass::class); $repository->disableFilters(); $repository->save(new EntityClass()); $repository->restoreFilters();
Disabling a single filter
You might want to disable a single filter.
$repository = $manager->getRepository(ObjectClass::class); $repository->disableFilter('locale'); $repository->save(new EntityClass()); $repository->restoreFilter('locale'); // $repository->restoreFilters();
requires the implementation of getFilterCollection method on custom repository
Paginating
Returns the same results that findBy
would return but within a \Zend\Paginator\Paginator
object with pagination information, an exception throwing version is also available. Provided by 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 method needs implementation on custom repository
Contributing
Found a bug or have a feature request? Please open a new issue. Have a look at existing issues before.
See file CONTRIBUTING.md
License
See file LICENSE included with the source code for a copy of the license terms.