Skip to content
This repository has been archived by the owner on Jan 21, 2020. It is now read-only.

Commit

Permalink
Merge pull request #150 from TomHAnderson/feature/create-filter
Browse files Browse the repository at this point in the history
Added Query Create Filters
  • Loading branch information
TomHAnderson committed Jan 23, 2015
2 parents a0b4cf1 + 2242d51 commit 57ac47d
Show file tree
Hide file tree
Showing 9 changed files with 203 additions and 0 deletions.
29 changes: 29 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,32 @@ When the query provider is registered attach it to the doctrine-connected resour
),
),
```

Query Create Filters
==============

In order to filter or change data sent to a create statement before it is used to hydrate the entity you may use a query create filter. Create filters are very similar to Query Providers in their implementation.

Create filters take the data as a paramter and return the data, modified or filtered.

A custom plugin manager is available to register your own create filters. This can be done through following configuration:

```php
'zf-apigility-doctrine-query-create-filter' => array(
'invokables' => array(
'entity_name' => 'Application\Query\CreateFilter\EntityName',
)
),
```

Register your Query Create Filter as:
```php
'zf-apigility' => array(
'doctrine-connected' => array(
'Api\\V1\\Rest\\....' => array(
'query_create_filter' => 'entity_name',
...
),
),
),
```
8 changes: 8 additions & 0 deletions config/server.config.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
'factories' => array(
'ZfApigilityDoctrineQueryProviderManager' =>
'ZF\Apigility\Doctrine\Server\Query\Provider\Service\QueryProviderManagerFactory',
'ZfApigilityDoctrineQueryCreateFilterManager' =>
'ZF\Apigility\Doctrine\Server\Query\CreateFilter\Service\QueryCreateFilterManagerFactory',
),
),

Expand All @@ -26,6 +28,12 @@
)
),

'zf-apigility-doctrine-query-create-filter' => array(
'invokables' => array(
'default' => 'ZF\Apigility\Doctrine\Server\Query\CreateFilter\DefaultCreateFilter',
)
),

'view_manager' => array(
'template_path_stack' => array(
'zf-apigility-doctrine' => __DIR__ . '/../view',
Expand Down
7 changes: 7 additions & 0 deletions src/Server/Module.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ public function init(ModuleManager $moduleManager)
'ZF\Apigility\Doctrine\Server\Query\Provider\QueryProviderInterface',
'getZfApigilityDoctrineQueryProviderConfig'
);

$serviceListener->addServiceManager(
'ZfApigilityDoctrineQueryCreateFilterManager',
'zf-apigility-doctrine-query-create-filter',
'ZF\Apigility\Doctrine\Server\Query\CreateFilter\QueryCreateFilterInterface',
'getZfApigilityDoctrineQueryCreateFilterConfig'
);
}

/**
Expand Down
53 changes: 53 additions & 0 deletions src/Server/Query/CreateFilter/DefaultCreateFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

namespace ZF\Apigility\Doctrine\Server\Query\CreateFilter;

use ZF\Apigility\Doctrine\Server\Query\CreateFilter\QueryCreateFilterInterface;
use DoctrineModule\Persistence\ObjectManagerAwareInterface;
use Doctrine\Common\Persistence\ObjectManager;
use ZF\ApiProblem\ApiProblem;
use ZF\Rest\ResourceEvent;

/**
* Class DefaultCreateFilter
*
* @package ZF\Apigility\Doctrine\Server\Query\CreateFilter
*/
class DefaultCreateFilter implements ObjectManagerAwareInterface, QueryCreateFilterInterface
{
/**
* @var ObjectManager
*/
protected $objectManager;

/**
* Set the object manager
*
* @param ObjectManager $objectManager
*/
public function setObjectManager(ObjectManager $objectManager)
{
$this->objectManager = $objectManager;
}

/**
* Get the object manager
*
* @return ObjectManager
*/
public function getObjectManager()
{
return $this->objectManager;
}

/**
* @param string $entityClass
* @param array $data
*
* @return array
*/
public function filter(ResourceEvent $event, $entityClass, $data)
{
return $data;
}
}
17 changes: 17 additions & 0 deletions src/Server/Query/CreateFilter/QueryCreateFilterInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace ZF\Apigility\Doctrine\Server\Query\CreateFilter;

use DoctrineModule\Persistence\ObjectManagerAwareInterface;
use ZF\Rest\ResourceEvent;

interface QueryCreateFilterInterface extends ObjectManagerAwareInterface
{
/**
* @param string $entityClass
* @param array $data
*
* @return array
*/
public function filter(ResourceEvent $event, $entityClass, $data);
}
35 changes: 35 additions & 0 deletions src/Server/Query/CreateFilter/Service/QueryCreateFilterManager.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace ZF\Apigility\Doctrine\Server\Query\CreateFilter\Service;

use ZF\Apigility\Doctrine\Server\Query\CreateFilter\QueryCreateFilterInterface;
use Zend\ServiceManager\AbstractPluginManager;
use Zend\ServiceManager\Exception;

class QueryCreateFilterManager extends AbstractPluginManager
{
protected $invokableClasses = array();

/**
* @param mixed $plugin
*
* @return void
* @throws Exception\RuntimeException
*/
public function validatePlugin($plugin)
{
if ($plugin instanceof QueryCreateFilterInterface) {
// we're okay
return;
}

// @codeCoverageIgnoreStart
throw new Exception\RuntimeException(
sprintf(
'Plugin of type %s is invalid; must implement QueryCreateFilterInterface',
(is_object($plugin) ? get_class($plugin) : gettype($plugin))
)
);
// @codeCoverageIgnoreEnd
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace ZF\Apigility\Doctrine\Server\Query\CreateFilter\Service;

use Zend\Mvc\Service\AbstractPluginManagerFactory;

class QueryCreateFilterManagerFactory extends AbstractPluginManagerFactory
{
const PLUGIN_MANAGER_CLASS = 'ZF\Apigility\Doctrine\Server\Query\CreateFilter\Service\QueryCreateFilterManager';
}
25 changes: 25 additions & 0 deletions src/Server/Resource/DoctrineResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use Traversable;
use Doctrine\ORM\NoResultException;
use Doctrine\Common\Collections\ArrayCollection;
use ZF\Apigility\Doctrine\Server\Query\CreateFilter\QueryCreateFilterInterface;

/**
* Class DoctrineResource
Expand Down Expand Up @@ -197,6 +198,24 @@ public function setEntityIdentifierName($value)
return $this;
}

/**
* @var QueryCreateFilterInterface
*/
protected $queryCreateFilter;

public function setQueryCreateFilter(QueryCreateFilterInterface $value)
{
$this->queryCreateFilter = $value;

return $this;
}

public function getQueryCreateFilter()
{
return $this->queryCreateFilter;
}


/**
* @var string
*/
Expand Down Expand Up @@ -278,6 +297,12 @@ public function getHydrator()
public function create($data)
{
$entityClass = $this->getEntityClass();

$data = $this->getQueryCreateFilter()->filter($this->getEvent(), $entityClass, $data);
if ($data instanceof ApiProblem) {
return $results->last();
}

$entity = new $entityClass;
$hydrator = $this->getHydrator();
$hydrator->hydrate((array) $data, $entity);
Expand Down
19 changes: 19 additions & 0 deletions src/Server/Resource/DoctrineResourceFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,14 @@ public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $
$objectManager = $this->loadObjectManager($serviceLocator, $doctrineConnectedConfig);
$hydrator = $this->loadHydrator($serviceLocator, $doctrineConnectedConfig, $objectManager);
$queryProviders = $this->loadQueryProviders($serviceLocator, $doctrineConnectedConfig, $objectManager);
$queryCreateFilter = $this->loadQueryCreateFilter($serviceLocator, $doctrineConnectedConfig, $objectManager);
$configuredListeners = $this->loadConfiguredListeners($serviceLocator, $doctrineConnectedConfig);

$listener = new $className();
$listener->setObjectManager($objectManager);
$listener->setHydrator($hydrator);
$listener->setQueryProviders($queryProviders);
$listener->setQueryCreateFilter($queryCreateFilter);
$listener->setServiceManager($serviceLocator);
$listener->setEntityIdentifierName($restConfig['entity_identifier_name']);
if (count($configuredListeners)) {
Expand Down Expand Up @@ -192,6 +194,23 @@ protected function loadHydrator(ServiceLocatorInterface $serviceLocator, $config
return $hydratorManager->get($config['hydrator']);
}

/**
* @param ServiceLocatorInterface $serviceLocator
* @param $config
* @param $objectManager
*
* @return ZF\Apigility\Doctrine\Query\Provider\FetchAll\FetchAllQueryProviderInterface
* @throws \Zend\ServiceManager\Exception\ServiceNotCreatedException
*/
protected function loadQueryCreateFilter(ServiceLocatorInterface $serviceLocator, $config, $objectManager)
{
$createFilterManager = $serviceLocator->get('ZfApigilityDoctrineQueryCreateFilterManager');
$filterManagerAlias = (isset($config['query_create_filter'])) ? $config['query_create_filter']: 'default';

return $createFilterManager->get($filterManagerAlias);
}


/**
* @param ServiceLocatorInterface $serviceLocator
* @param $config
Expand Down

0 comments on commit 57ac47d

Please sign in to comment.