Commit 19d54457 authored by Bas de Nooijer's avatar Bas de Nooijer

Implemented Symfony event dispatcher component in client

parent a5c67178
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
*/ */
namespace Solarium\Core\Client; namespace Solarium\Core\Client;
use Solarium\Core\Configurable; use Solarium\Core\Configurable;
use Solarium\Core\PluginInterface; use Solarium\Core\Plugin\PluginInterface;
use Solarium\Core\Query\QueryInterface; use Solarium\Core\Query\QueryInterface;
use Solarium\Core\Query\Result\ResultInterface; use Solarium\Core\Query\Result\ResultInterface;
use Solarium\Core\Client\Adapter\AdapterInterface; use Solarium\Core\Client\Adapter\AdapterInterface;
...@@ -46,6 +46,19 @@ use Solarium\Core\Query\RequestBuilderInterface; ...@@ -46,6 +46,19 @@ use Solarium\Core\Query\RequestBuilderInterface;
use Solarium\Exception\InvalidArgumentException; use Solarium\Exception\InvalidArgumentException;
use Solarium\Exception\OutOfBoundsException; use Solarium\Exception\OutOfBoundsException;
use Solarium\Exception\UnexpectedValueException; use Solarium\Exception\UnexpectedValueException;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Solarium\Core\Event\Events;
use Solarium\Core\Event\PreCreateRequest as PreCreateRequestEvent;
use Solarium\Core\Event\PostCreateRequest as PostCreateRequestEvent;
use Solarium\Core\Event\PreCreateQuery as PreCreateQueryEvent;
use Solarium\Core\Event\PostCreateQuery as PostCreateQueryEvent;
use Solarium\Core\Event\PreCreateResult as PreCreateResultEvent;
use Solarium\Core\Event\PostCreateResult as PostCreateResultEvent;
use Solarium\Core\Event\PreExecute as PreExecuteEvent;
use Solarium\Core\Event\PostExecute as PostExecuteEvent;
use Solarium\Core\Event\PreExecuteRequest as PreExecuteRequestEvent;
use Solarium\Core\Event\PostExecuteRequest as PostExecuteRequestEvent;
/** /**
* Main interface for interaction with Solr * Main interface for interaction with Solr
...@@ -148,11 +161,18 @@ class Client extends Configurable ...@@ -148,11 +161,18 @@ class Client extends Configurable
'loadbalancer' => 'Solarium\Plugin\Loadbalancer\Loadbalancer', 'loadbalancer' => 'Solarium\Plugin\Loadbalancer\Loadbalancer',
'postbigrequest' => 'Solarium\Plugin\PostBigRequest', 'postbigrequest' => 'Solarium\Plugin\PostBigRequest',
'customizerequest' => 'Solarium\Plugin\CustomizeRequest\CustomizeRequest', 'customizerequest' => 'Solarium\Plugin\CustomizeRequest\CustomizeRequest',
'parallelexecution' => 'Solarium\Plugin\ParallelExecution', 'parallelexecution' => 'Solarium\Plugin\ParallelExecution\ParallelExecution',
'bufferedadd' => 'Solarium\Plugin\BufferedAdd', 'bufferedadd' => 'Solarium\Plugin\BufferedAdd\BufferedAdd',
'prefetchiterator' => 'Solarium\Plugin\PrefetchIterator', 'prefetchiterator' => 'Solarium\Plugin\PrefetchIterator',
); );
/**
* EventDispatcher
*
* @var EventDispatcher
*/
protected $eventDispatcher;
/** /**
* Registered plugin instances * Registered plugin instances
* *
...@@ -200,6 +220,7 @@ class Client extends Configurable ...@@ -200,6 +220,7 @@ class Client extends Configurable
*/ */
protected function init() protected function init()
{ {
$this->eventDispatcher = new EventDispatcher();
foreach ($this->options as $name => $value) { foreach ($this->options as $name => $value) {
switch ($name) { switch ($name) {
case 'endpoint': case 'endpoint':
...@@ -476,7 +497,7 @@ class Client extends Configurable ...@@ -476,7 +497,7 @@ class Client extends Configurable
* calling {@see createAdapter()} * calling {@see createAdapter()}
* *
* @param boolean $autoload * @param boolean $autoload
* @return Adapter\AdapterInterface * @return AdapterInterface
*/ */
public function getAdapter($autoload = true) public function getAdapter($autoload = true)
{ {
...@@ -537,6 +558,16 @@ class Client extends Configurable ...@@ -537,6 +558,16 @@ class Client extends Configurable
return $this->queryTypes; return $this->queryTypes;
} }
/**
* Get the EventDispatcherInstance
*
* @return EventDispatcher
*/
public function getEventDispatcher()
{
return $this->eventDispatcher;
}
/** /**
* Register a plugin * Register a plugin
* *
...@@ -546,7 +577,7 @@ class Client extends Configurable ...@@ -546,7 +577,7 @@ class Client extends Configurable
* *
* @throws InvalidArgumentException * @throws InvalidArgumentException
* @param string $key * @param string $key
* @param string|\Solarium\Core\Plugin $plugin * @param string|PluginInterface $plugin
* @param array $options * @param array $options
* @return self Provides fluent interface * @return self Provides fluent interface
*/ */
...@@ -608,7 +639,7 @@ class Client extends Configurable ...@@ -608,7 +639,7 @@ class Client extends Configurable
* @throws OutOfBoundsException * @throws OutOfBoundsException
* @param string $key * @param string $key
* @param boolean $autocreate * @param boolean $autocreate
* @return \Solarium\Core\Plugin|null * @return PluginInterface|null
*/ */
public function getPlugin($key, $autocreate = true) public function getPlugin($key, $autocreate = true)
{ {
...@@ -632,7 +663,7 @@ class Client extends Configurable ...@@ -632,7 +663,7 @@ class Client extends Configurable
* *
* You can remove a plugin by passing the plugin key, or the plugin instance * You can remove a plugin by passing the plugin key, or the plugin instance
* *
* @param string|\Solarium\Core\Plugin $plugin * @param string|PluginInterface $plugin
* @return self Provides fluent interface * @return self Provides fluent interface
*/ */
public function removePlugin($plugin) public function removePlugin($plugin)
...@@ -653,50 +684,6 @@ class Client extends Configurable ...@@ -653,50 +684,6 @@ class Client extends Configurable
return $this; return $this;
} }
/**
* Trigger external events for plugins
*
* This methods adds 'namespacing' to the event name to prevent conflicts with Solariums internal event keys.
*
* Based on the event name you can always tell if an event was internal (Solarium base classes)
* or external (plugins, even if it's a plugin included with Solarium).
*
* External events always have the 'event' prefix in the event name.
*
* @param string $event
* @param array $params
* @param bool $resultOverride
* @return void|mixed
*/
public function triggerEvent($event, $params = array(), $resultOverride = false)
{
// Add namespacing
$event = 'event'.$event;
return $this->callPlugins($event, $params, $resultOverride);
}
/**
* Forward events to plugins
*
* @param string $event
* @param array $params
* @param bool $resultOverride
* @return void|mixed
*/
protected function callPlugins($event, $params, $resultOverride = false)
{
foreach ($this->pluginInstances as $plugin) {
if (method_exists($plugin, $event)) {
$result = call_user_func_array(array($plugin, $event), $params);
if ($result !== null && $resultOverride) {
return $result;
}
}
}
}
/** /**
* Creates a request based on a query instance * Creates a request based on a query instance
* *
...@@ -706,9 +693,10 @@ class Client extends Configurable ...@@ -706,9 +693,10 @@ class Client extends Configurable
*/ */
public function createRequest(QueryInterface $query) public function createRequest(QueryInterface $query)
{ {
$pluginResult = $this->callPlugins('preCreateRequest', array($query), true); $event = new PreCreateRequestEvent($query);
if ($pluginResult !== null) { $this->eventDispatcher->dispatch(Events::PRE_CREATE_REQUEST, $event);
return $pluginResult; if ($event->getRequest() !== null) {
return $event->getRequest();
} }
$requestBuilder = $query->getRequestBuilder(); $requestBuilder = $query->getRequestBuilder();
...@@ -718,7 +706,10 @@ class Client extends Configurable ...@@ -718,7 +706,10 @@ class Client extends Configurable
$request = $requestBuilder->build($query); $request = $requestBuilder->build($query);
$this->callPlugins('postCreateRequest', array($query, $request)); $this->eventDispatcher->dispatch(
Events::POST_CREATE_REQUEST,
new PostCreateRequestEvent($query, $request)
);
return $request; return $request;
} }
...@@ -733,9 +724,10 @@ class Client extends Configurable ...@@ -733,9 +724,10 @@ class Client extends Configurable
*/ */
public function createResult(QueryInterface $query, $response) public function createResult(QueryInterface $query, $response)
{ {
$pluginResult = $this->callPlugins('preCreateResult', array($query, $response), true); $event = new PreCreateResultEvent($query, $response);
if ($pluginResult !== null) { $this->eventDispatcher->dispatch(Events::PRE_CREATE_RESULT, $event);
return $pluginResult; if ($event->getResult() !== null) {
return $event->getResult();
} }
$resultClass = $query->getResultClass(); $resultClass = $query->getResultClass();
...@@ -745,7 +737,10 @@ class Client extends Configurable ...@@ -745,7 +737,10 @@ class Client extends Configurable
throw new UnexpectedValueException('Result class must implement the ResultInterface'); throw new UnexpectedValueException('Result class must implement the ResultInterface');
} }
$this->callPlugins('postCreateResult', array($query, $response, $result)); $this->eventDispatcher->dispatch(
Events::POST_CREATE_RESULT,
new PostCreateResultEvent($query, $response, $result)
);
return $result; return $result;
} }
...@@ -759,16 +754,20 @@ class Client extends Configurable ...@@ -759,16 +754,20 @@ class Client extends Configurable
*/ */
public function execute(QueryInterface $query, $endpoint = null) public function execute(QueryInterface $query, $endpoint = null)
{ {
$pluginResult = $this->callPlugins('preExecute', array($query), true); $event = new PreExecuteEvent($query);
if ($pluginResult !== null) { $this->eventDispatcher->dispatch(Events::PRE_EXECUTE, $event);
return $pluginResult; if ($event->getResult() !== null) {
return $event->getResult();
} }
$request = $this->createRequest($query); $request = $this->createRequest($query);
$response = $this->executeRequest($request, $endpoint); $response = $this->executeRequest($request, $endpoint);
$result = $this->createResult($query, $response); $result = $this->createResult($query, $response);
$this->callPlugins('postExecute', array($query, $result)); $this->eventDispatcher->dispatch(
Events::POST_EXECUTE,
new PostExecuteEvent($query, $result)
);
return $result; return $result;
} }
...@@ -787,14 +786,18 @@ class Client extends Configurable ...@@ -787,14 +786,18 @@ class Client extends Configurable
$endpoint = $this->getEndpoint($endpoint); $endpoint = $this->getEndpoint($endpoint);
} }
$pluginResult = $this->callPlugins('preExecuteRequest', array($request), true); $event = new PreExecuteRequestEvent($request, $endpoint);
if ($pluginResult !== null) { $this->eventDispatcher->dispatch(Events::PRE_EXECUTE_REQUEST, $event);
$response = $pluginResult; //a plugin result overrules the standard execution result if ($event->getResponse() !== null) {
$response = $event->getResponse(); //a plugin result overrules the standard execution result
} else { } else {
$response = $this->getAdapter()->execute($request, $endpoint); $response = $this->getAdapter()->execute($request, $endpoint);
} }
$this->callPlugins('postExecuteRequest', array($request, $response)); $this->eventDispatcher->dispatch(
Events::POST_EXECUTE_REQUEST,
new PostExecuteRequestEvent($request, $endpoint, $response)
);
return $response; return $response;
} }
...@@ -971,9 +974,10 @@ class Client extends Configurable ...@@ -971,9 +974,10 @@ class Client extends Configurable
{ {
$type = strtolower($type); $type = strtolower($type);
$pluginResult = $this->callPlugins('preCreateQuery', array($type, $options), true); $event = new PreCreateQueryEvent($type, $options);
if ($pluginResult !== null) { $this->eventDispatcher->dispatch(Events::PRE_CREATE_QUERY, $event);
return $pluginResult; if ($event->getQuery() !== null) {
return $event->getQuery();
} }
if (!isset($this->queryTypes[$type])) { if (!isset($this->queryTypes[$type])) {
...@@ -987,7 +991,10 @@ class Client extends Configurable ...@@ -987,7 +991,10 @@ class Client extends Configurable
throw new UnexpectedValueException('All query classes must implement the QueryInterface'); throw new UnexpectedValueException('All query classes must implement the QueryInterface');
} }
$this->callPlugins('postCreateQuery', array($type, $options, $query)); $this->eventDispatcher->dispatch(
Events::POST_CREATE_QUERY,
new PostCreateQueryEvent($type, $options, $query)
);
return $query; return $query;
} }
......
...@@ -56,7 +56,7 @@ interface QueryInterface extends ConfigurableInterface ...@@ -56,7 +56,7 @@ interface QueryInterface extends ConfigurableInterface
/** /**
* Get the requestbuilder class for this query * Get the requestbuilder class for this query
* *
* @return object * @return RequestBuilderInterface
*/ */
public function getRequestBuilder(); public function getRequestBuilder();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment