Allow for catching/logging persistance errors per listener
This commit is contained in:
parent
6f444f1ce8
commit
53332eb057
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue