diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index e77919c..002c78e 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -289,6 +289,9 @@ class Configuration implements ConfigurationInterface ->scalarNode('update')->defaultTrue()->end() ->scalarNode('delete')->defaultTrue()->end() ->booleanNode('immediate')->defaultFalse()->end() + ->scalarNode('logger') + ->treatTrueLike('fos_elastica.logger') + ->end() ->scalarNode('service')->end() ->variableNode('is_indexable_callback')->defaultNull()->end() ->end() diff --git a/DependencyInjection/FOSElasticaExtension.php b/DependencyInjection/FOSElasticaExtension.php index 1d1540f..7511e2b 100644 --- a/DependencyInjection/FOSElasticaExtension.php +++ b/DependencyInjection/FOSElasticaExtension.php @@ -432,8 +432,12 @@ class FOSElasticaExtension extends Extension $listenerDef = new DefinitionDecorator($abstractListenerId); $listenerDef->replaceArgument(0, new Reference($objectPersisterId)); $listenerDef->replaceArgument(1, $typeConfig['model']); - $listenerDef->replaceArgument(3, $typeConfig['identifier']); $listenerDef->replaceArgument(2, $this->getDoctrineEvents($typeConfig)); + $listenerDef->replaceArgument(3, $typeConfig['identifier']); + if (isset($typeConfig['listener']['logger'])) { + $listenerDef->replaceArgument(4, new Reference($typeConfig['listener']['logger'])); + } + switch ($typeConfig['driver']) { case 'orm': $listenerDef->addTag('doctrine.event_subscriber'); break; case 'mongodb': $listenerDef->addTag('doctrine_mongodb.odm.event_subscriber'); break; diff --git a/Doctrine/Listener.php b/Doctrine/Listener.php index b6217a6..ded3998 100644 --- a/Doctrine/Listener.php +++ b/Doctrine/Listener.php @@ -2,6 +2,7 @@ namespace FOS\ElasticaBundle\Doctrine; +use Psr\Log\LoggerInterface; use Doctrine\Common\EventArgs; use Doctrine\Common\EventSubscriber; use FOS\ElasticaBundle\Persister\ObjectPersisterInterface; @@ -85,13 +86,17 @@ class Listener implements EventSubscriber * @param array $events * @param string $esIdentifierField */ - public function __construct(ObjectPersisterInterface $objectPersister, $objectClass, array $events, $esIdentifierField = 'id') + public function __construct(ObjectPersisterInterface $objectPersister, $objectClass, array $events, $esIdentifierField = 'id', $logger = null) { $this->objectPersister = $objectPersister; $this->objectClass = $objectClass; $this->events = $events; $this->esIdentifierField = $esIdentifierField; + if ($logger) { + $this->objectPersister->setLogger($logger); + } + $this->propertyAccessor = PropertyAccess::createPropertyAccessor(); } diff --git a/Persister/ObjectPersister.php b/Persister/ObjectPersister.php index 38541c8..cea6167 100644 --- a/Persister/ObjectPersister.php +++ b/Persister/ObjectPersister.php @@ -2,6 +2,8 @@ namespace FOS\ElasticaBundle\Persister; +use Psr\Log\LoggerInterface; +use Elastica\Exception\BulkException; use Elastica\Exception\NotFoundException; use FOS\ElasticaBundle\Transformer\ModelToElasticaTransformerInterface; use Elastica\Type; @@ -19,6 +21,7 @@ class ObjectPersister implements ObjectPersisterInterface protected $transformer; protected $objectClass; protected $fields; + protected $logger; public function __construct(Type $type, ModelToElasticaTransformerInterface $transformer, $objectClass, array $fields) { @@ -28,6 +31,18 @@ class ObjectPersister implements ObjectPersisterInterface $this->fields = $fields; } + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + } + + private function log(BulkException $e) + { + if ($this->logger) { + $this->logger->error($e); + } + } + /** * Insert one object into the type * The object will be transformed to an elastica document @@ -95,7 +110,11 @@ class ObjectPersister implements ObjectPersisterInterface foreach ($objects as $object) { $documents[] = $this->transformToElasticaDocument($object); } - $this->type->addDocuments($documents); + try { + $this->type->addDocuments($documents); + } catch (BulkException $e) { + $this->log($e); + } } /** @@ -111,7 +130,12 @@ class ObjectPersister implements ObjectPersisterInterface $document->setDocAsUpsert(true); $documents[] = $document; } - $this->type->updateDocuments($documents); + + try { + $this->type->updateDocuments($documents); + } catch (BulkException $e) { + $this->log($e); + } } /** @@ -125,7 +149,11 @@ class ObjectPersister implements ObjectPersisterInterface foreach ($objects as $object) { $documents[] = $this->transformToElasticaDocument($object); } - $this->type->deleteDocuments($documents); + try { + $this->type->deleteDocuments($documents); + } catch (BulkException $e) { + $this->log($e); + } } /** @@ -135,7 +163,11 @@ class ObjectPersister implements ObjectPersisterInterface */ public function deleteManyByIdentifiers(array $identifiers) { - $this->type->getIndex()->getClient()->deleteIds($identifiers, $this->type->getIndex(), $this->type); + try { + $this->type->getIndex()->getClient()->deleteIds($identifiers, $this->type->getIndex(), $this->type); + } catch (BulkException $e) { + $this->log($e); + } } /** @@ -148,4 +180,4 @@ class ObjectPersister implements ObjectPersisterInterface { return $this->transformer->transform($object, $this->fields); } -} +} \ No newline at end of file diff --git a/Resources/doc/types.md b/Resources/doc/types.md index 38fa045..7e0fe05 100644 --- a/Resources/doc/types.md +++ b/Resources/doc/types.md @@ -274,5 +274,21 @@ option on a type persistence configuration to false. ```yaml persistence: - immediate: false + listener: + is_indexable_callback: "user.isActive() && user.hasRole('ROLE_USER')" ``` + +Logging Errors +-------------- + +By default FOSElasticaBundle will not catch errors thrown by Elastica/ElasticSearch. +Configure a logger per listener if you would rather catch and log these. + +```yaml + persistence: + listener: + logger: true +``` + +Specifying `true` will use the default Elastica logger. Alternatively define your own +logger service id.