Allow for catching/logging persistance errors per listener

This commit is contained in:
Evan Owens 2014-04-04 18:32:48 -04:00 committed by nurikabe
parent 6f444f1ce8
commit 53332eb057
5 changed files with 68 additions and 8 deletions

View file

@ -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()

View file

@ -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;

View file

@ -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();
}

View file

@ -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);
}
}
}

View file

@ -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.