Skip to content

Commit

Permalink
manage filters
Browse files Browse the repository at this point in the history
  • Loading branch information
juliangut committed Oct 7, 2017
1 parent 5cf1d3b commit e78b40d
Show file tree
Hide file tree
Showing 6 changed files with 275 additions and 1 deletion.
40 changes: 39 additions & 1 deletion README.md
Expand Up @@ -29,6 +29,7 @@ Create your custom repository implementing Repository interface
```php
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;
Expand All @@ -37,8 +38,14 @@ 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
Expand All @@ -53,7 +60,7 @@ class customRepository extends EntityRepository implements Repository
{
// Custom implementation
}

// Custom methods
}
```
Expand Down Expand Up @@ -198,6 +205,37 @@ $repository->restoreEventListener('onFlush');
// $repository->restoreAllEventListener();
```

## Filters managing

Filters managing is provided by `FiltersTrait`

### Disabling filters

You might want to temporarily disable all filters.

```php
$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.

```php
$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. Provided by `PaginatorTrait`
Expand Down
98 changes: 98 additions & 0 deletions src/FiltersTrait.php
@@ -0,0 +1,98 @@
<?php

/*
* doctrine-base-repositories (https://github.com/juliangut/doctrine-base-repositories).
* Doctrine2 utility repositories.
*
* @license MIT
* @link https://github.com/juliangut/doctrine-base-repositories
* @author Julián Gutiérrez <juliangut@gmail.com>
*/

declare(strict_types=1);

namespace Jgut\Doctrine\Repository;

/**
* Filters trait.
*/
trait FiltersTrait
{
/**
* List of disabled filters.
*
* @var object[]
*/
protected $disabledFilters = [];

/**
* Disable all filters.
*/
public function disableFilters()
{
foreach (array_keys($this->getFilterCollection()->getEnabledFilters()) as $filter) {
$this->disableFilter($filter);
}
}

/**
* Disable filter.
*
* @param string $filter
*/
public function disableFilter(string $filter)
{
if (in_array($filter, $this->disabledFilters, true)) {
return;
}

$this->getFilterCollection()->disable($filter);

$this->disabledFilters[] = $filter;
}

/**
* Restore all disabled filters.
*/
public function restoreFilters()
{
$filterCollection = $this->getFilterCollection();

foreach ($this->disabledFilters as $filter) {
$filterCollection->enable($filter);
}

$this->disabledFilters = [];
}

/**
* Restore disabled filter.
*
* @param string $filter
*/
public function restoreFilter(string $filter)
{
$position = array_search($filter, $this->disabledFilters, true);
if ($position === false) {
return;
}

$this->getFilterCollection()->enable($filter);

array_splice($this->disabledFilters, $position, 1);
}

/**
* Get filter collection.
*
* @return object
*/
abstract protected function getFilterCollection();

/**
* Get object manager.
*
* @return \Doctrine\Common\Persistence\ObjectManager
*/
abstract protected function getManager();
}
24 changes: 24 additions & 0 deletions src/Repository.php
Expand Up @@ -100,6 +100,30 @@ public function restoreEventListeners(string $event);
*/
public function getRegisteredEvents(): array;

/**
* Disable all filters.
*/
public function disableFilters();

/**
* Disable filter.
*
* @param string $filter
*/
public function disableFilter(string $filter);

/**
* Restore all disabled filters.
*/
public function restoreFilters();

/**
* Restore disabled filter.
*
* @param string $filter
*/
public function restoreFilter(string $filter);

/**
* Return paginated elements filtered by criteria.
*
Expand Down
68 changes: 68 additions & 0 deletions tests/Repository/FiltersTraitTest.php
@@ -0,0 +1,68 @@
<?php

/*
* doctrine-base-repositories (https://github.com/juliangut/doctrine-base-repositories).
* Doctrine2 utility repositories.
*
* @license MIT
* @link https://github.com/juliangut/doctrine-base-repositories
* @author Julián Gutiérrez <juliangut@gmail.com>
*/

declare(strict_types=1);

namespace Jgut\Doctrine\Repository\Tests;

use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Query\FilterCollection;
use Jgut\Doctrine\Repository\Tests\Stubs\FilterStub;
use Jgut\Doctrine\Repository\Tests\Stubs\RepositoryStub;

/**
* Filters trait tests.
*/
class FiltersTraitTest extends \PHPUnit_Framework_TestCase
{
public function testFiltersManagement()
{
$manager = $this->getMockBuilder(EntityManager::class)
->disableOriginalConstructor()
->getMock();
/* @var EntityManager $manager */

$config = new Configuration();
$config->addFilter('anything', new FilterStub($manager));

$manager->expects(self::any())
->method('getConfiguration')
->will(static::returnValue($config));

$filterCollection = new FilterCollection($manager);
$filterCollection->enable('anything');

$manager->expects(self::any())
->method('getFilters')
->will(static::returnValue($filterCollection));

$repository = new RepositoryStub($manager);

$repository->disableFilter('anything');
static::assertCount(0, $filterCollection->getEnabledFilters());

$repository->disableFilter('anything');
static::assertCount(0, $filterCollection->getEnabledFilters());

$repository->restoreFilter('unknown');
static::assertCount(0, $filterCollection->getEnabledFilters());

$repository->restoreFilter('anything');
static::assertCount(1, $filterCollection->getEnabledFilters());

$repository->disableFilters();
static::assertCount(0, $filterCollection->getEnabledFilters());

$repository->restoreFilters();
static::assertCount(1, $filterCollection->getEnabledFilters());
}
}
36 changes: 36 additions & 0 deletions tests/Repository/Stubs/FilterStub.php
@@ -0,0 +1,36 @@
<?php

/*
* doctrine-base-repositories (https://github.com/juliangut/doctrine-base-repositories).
* Doctrine2 utility repositories.
*
* @license MIT
* @link https://github.com/juliangut/doctrine-base-repositories
* @author Julián Gutiérrez <juliangut@gmail.com>
*/

declare(strict_types=1);

namespace Jgut\Doctrine\Repository\Tests\Stubs;

use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Query\Filter\SQLFilter;

/**
* Filter stub.
*/
class FilterStub extends SQLFilter
{
/**
* {@inheritdoc}
*/
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
// Check if the entity implements the LocalAware interface
if (!$targetEntity->reflClass->implementsInterface('anything')) {
return '';
}

return $targetTableAlias . '.anything = ' . $this->getParameter('anything');
}
}
10 changes: 10 additions & 0 deletions tests/Repository/Stubs/RepositoryStub.php
Expand Up @@ -16,6 +16,7 @@
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
use Doctrine\ORM\EntityManager;
use Jgut\Doctrine\Repository\EventsTrait;
use Jgut\Doctrine\Repository\FiltersTrait;
use Jgut\Doctrine\Repository\Repository;
use Jgut\Doctrine\Repository\RepositoryTrait;
use Zend\Paginator\Paginator;
Expand All @@ -27,6 +28,7 @@ class RepositoryStub implements Repository
{
use RepositoryTrait;
use EventsTrait;
use FiltersTrait;

/**
* @var EntityManager
Expand Down Expand Up @@ -127,4 +129,12 @@ protected function getClassMetadata(): ClassMetadata
{
return new \Doctrine\ORM\Mapping\ClassMetadataInfo(self::class);
}

/**
* {@inheritdoc}
*/
protected function getFilterCollection()
{
return $this->entityManager->getFilters();
}
}

0 comments on commit e78b40d

Please sign in to comment.