Completed
Pull Request — master (#6)
by Tomáš
21:18 queued 10:54
created

FilterManager::enableFilters()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 16
ccs 8
cts 8
cp 1
rs 8.8571
cc 5
eloc 8
nc 4
nop 0
crap 5
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of Zenify
7
 * Copyright (c) 2012 Tomas Votruba (http://tomasvotruba.cz)
8
 */
9
10
namespace Zenify\DoctrineFilters;
11
12
use Doctrine\ORM\EntityManagerInterface;
13
use ReflectionClass;
14
use Zenify\DoctrineFilters\Contract\ConditionalFilterInterface;
15
use Zenify\DoctrineFilters\Contract\FilterInterface;
16
use Zenify\DoctrineFilters\Contract\FilterManagerInterface;
17
18
19
final class FilterManager implements FilterManagerInterface
20
{
21
22
	/**
23
	 * @var FilterInterface[]
24
	 */
25
	private $filters = [];
26
27
	/**
28
	 * @var EntityManagerInterface
29
	 */
30
	private $entityManager;
31
32
	/**
33 3
	 * @var bool
34
	 */
35 3
	private $areFiltersEnabled = FALSE;
36 3
37
38
	public function __construct(EntityManagerInterface $entityManager)
39 3
	{
40
		$this->entityManager = $entityManager;
41 3
	}
42 3
43
44
	public function addFilter(string $name, FilterInterface $filter)
45 3
	{
46
		$this->filters[$name] = $filter;
47 3
	}
48 3
49 3
50
	public function enableFilters()
51
	{
52 3
		if ($this->areFiltersEnabled) {
53
			return;
54 3
		}
55
56
		foreach ($this->filters as $name => $filter) {
57 3
			if ($filter instanceof ConditionalFilterInterface && ! $filter->isEnabled()) {
58
				continue;
59 3
			}
60
61 3
			$this->addFilterToEnabledInFilterCollection($name, $filter);
62 3
		}
63 3
64
		$this->areFiltersEnabled = TRUE;
65 3
	}
66 3
67 3
68 3
	private function addFilterToEnabledInFilterCollection(string $name, FilterInterface $filter)
69
	{
70
		$filterCollection = $this->entityManager->getFilters();
71
72
		$filterCollectionReflection = new ReflectionClass($filterCollection);
73
		$enabledFiltersReflection = $filterCollectionReflection->getProperty('enabledFilters');
74
		$enabledFiltersReflection->setAccessible(TRUE);
75
76
		$enabledFilters = $enabledFiltersReflection->getValue($filterCollection);
77
		$enabledFilters[$name] = $filter;
78
		$enabledFiltersReflection->setValue($filterCollection, $enabledFilters);
79
	}
80
81
}
82