1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114:
<?php
namespace ApiBundle\Doctrine\ORM\Filter;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\QueryBuilder;
use Dunglas\ApiBundle\Api\IriConverterInterface;
use Dunglas\ApiBundle\Api\ResourceInterface;
use Dunglas\ApiBundle\Doctrine\Orm\Filter\FilterInterface;
use Fidry\LoopBackApiBundle\Filter\FilterTrait;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
abstract class AbstractResourceSearchFilter implements FilterInterface
{
use FilterTrait;
private $iriConverter;
private $propertyAccessor;
public function __construct(
ManagerRegistry $managerRegistry,
IriConverterInterface $iriConverter,
PropertyAccessorInterface $propertyAccessor,
array $properties = null
) {
$this->iriConverter = $iriConverter;
$this->propertyAccessor = $propertyAccessor;
$this->properties = (null === $properties) ? $properties : array_flip($properties);
}
public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder, Request $request)
{
if ($this->getResourceClass() === $resource->getEntityClass()) {
$this->applyFilter($resource, $queryBuilder, $this->extractProperties($request));
}
}
abstract protected function applyFilter(
ResourceInterface $resource,
QueryBuilder $queryBuilder,
array $queryValues
);
abstract protected function getResourceClass();
protected function getFilterValueFromUrl($value)
{
try {
if ($item = $this->iriConverter->getItemFromIri($value)) {
return $this->propertyAccessor->getValue($item, 'id');
}
} catch (\InvalidArgumentException $e) {
}
return $value;
}
}