Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Refactoring of event listeners(closes #8, #89, #123, #297) #617

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions Adapter/AdapterInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
namespace Vich\UploaderBundle\Adapter;

/**
* AdapterInterface.
*
* @author Dustin Dobervich <ddobervich@gmail.com>
*/
interface AdapterInterface
Expand All @@ -17,11 +15,4 @@ interface AdapterInterface
* @return object The mapped object
*/
public function getObjectFromArgs($event);

/**
* Recomputes the change set for the object.
*
* @param object $event The event
*/
public function recomputeChangeSet($event);
}
15 changes: 15 additions & 0 deletions Adapter/DoctrineAdapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Vich\UploaderBundle\Adapter;

use Doctrine\Common\EventArgs;

interface DoctrineAdapter extends AdapterInterface
{
/**
* @param EventArgs $event
*
* @return array[]
*/
public function getIdentityMapForEvent(EventArgs $event);
}
18 changes: 8 additions & 10 deletions Adapter/ODM/MongoDB/MongoDBAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Vich\UploaderBundle\Adapter\ODM\MongoDB;

use Vich\UploaderBundle\Adapter\AdapterInterface;
use Doctrine\Common\EventArgs;
use Doctrine\ODM\MongoDB\Event\PreFlushEventArgs;
use Vich\UploaderBundle\Adapter\DoctrineAdapter;

/**
* MongoDBAdapter.
*
* @author Dustin Dobervich <ddobervich@gmail.com>
*/
class MongoDBAdapter implements AdapterInterface
class MongoDBAdapter implements DoctrineAdapter
{
/**
* {@inheritdoc}
Expand All @@ -22,13 +22,11 @@ public function getObjectFromArgs($event)
/**
* {@inheritdoc}
*/
public function recomputeChangeSet($event)
public function getIdentityMapForEvent(EventArgs $event)
{
$object = $this->getObjectFromArgs($event);
/* @var $event PreFlushEventArgs */
$em = $event->getDocumentManager();

$dm = $event->getDocumentManager();
$uow = $dm->getUnitOfWork();
$metadata = $dm->getClassMetadata(get_class($object));
$uow->recomputeSingleDocumentChangeSet($metadata, $object);
return $em->getUnitOfWork()->getIdentityMap();
}
}
21 changes: 8 additions & 13 deletions Adapter/ORM/DoctrineORMAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Vich\UploaderBundle\Adapter\ORM;

use Vich\UploaderBundle\Adapter\AdapterInterface;
use Doctrine\Common\EventArgs;
use Doctrine\ORM\Event\PreFlushEventArgs;
use Vich\UploaderBundle\Adapter\DoctrineAdapter;

/**
* DoctrineORMAdapter.
*
* @author Dustin Dobervich <ddobervich@gmail.com>
*/
class DoctrineORMAdapter implements AdapterInterface
class DoctrineORMAdapter implements DoctrineAdapter
{
/**
* {@inheritdoc}
Expand All @@ -19,16 +19,11 @@ public function getObjectFromArgs($event)
return $event->getEntity();
}

/**
* {@inheritdoc}
*/
public function recomputeChangeSet($event)
public function getIdentityMapForEvent(EventArgs $event)
{
$object = $this->getObjectFromArgs($event);

/* @var $event PreFlushEventArgs */
$em = $event->getEntityManager();
$uow = $em->getUnitOfWork();
$metadata = $em->getClassMetadata(get_class($object));
$uow->recomputeSingleEntityChangeSet($metadata, $object);

return $em->getUnitOfWork()->getIdentityMap();
}
}
18 changes: 9 additions & 9 deletions Adapter/PHPCR/PHPCRAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Vich\UploaderBundle\Adapter\PHPCR;

use Vich\UploaderBundle\Adapter\AdapterInterface;
use Doctrine\Common\EventArgs;
use Doctrine\Common\Persistence\Event\ManagerEventArgs;
use Vich\UploaderBundle\Adapter\DoctrineAdapter;

/**
* PHPCRAdapter.
*
* @author Ben Glassman <bglassman@gmail.com>
*/
class PHPCRAdapter implements AdapterInterface
class PHPCRAdapter implements DoctrineAdapter
{
/**
* {@inheritdoc}
Expand All @@ -22,12 +22,12 @@ public function getObjectFromArgs($event)
/**
* {@inheritdoc}
*/
public function recomputeChangeSet($event)
public function getIdentityMapForEvent(EventArgs $event)
{
$object = $this->getObjectFromArgs($event);
/* @var $event ManagerEventArgs */
$em = $event->getObjectManager();
//FIXME: fix getIdentityMap call https://github.com/doctrine/phpcr-odm/blob/master/lib/Doctrine/ODM/PHPCR/UnitOfWork.php

$dm = $event->getObjectManager();
$uow = $dm->getUnitOfWork();
$uow->computeSingleDocumentChangeSet($object);
return $em->getUnitOfWork()->getIdentityMap();
}
}
9 changes: 0 additions & 9 deletions Adapter/Propel/PropelORMAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
use Vich\UploaderBundle\Adapter\AdapterInterface;

/**
* Propel adapter.
*
* @author Kévin Gomez <contact@kevingomez.fr>
*/
class PropelORMAdapter implements AdapterInterface
Expand All @@ -18,11 +16,4 @@ public function getObjectFromArgs($event)
{
return $event->getSubject();
}

/**
* {@inheritdoc}
*/
public function recomputeChangeSet($event)
{
}
}
70 changes: 52 additions & 18 deletions DependencyInjection/VichUploaderExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ public function load(array $configs, ContainerBuilder $container)
$this->registerMetadataDirectories($container, $config);
$this->registerCacheStrategy($container, $config);

$this->registerListeners($container, $config);
$this->registerDoctrineListeners($container, $config);
$this->registerPropelListeners($container, $config);

$this->registerFormTheme($container);
}
Expand Down Expand Up @@ -150,28 +151,52 @@ protected function fixDbDriverConfig(array $config)
return $config;
}

protected function registerListeners(ContainerBuilder $container, array $config)
protected function registerDoctrineListeners(ContainerBuilder $container, array $config)
{
$dbDrivers = [];
foreach ($config['mappings'] as $mapping) {
$dbDrivers[$mapping['db_driver']] = true;
}

// register propel via compiler pass
unset($dbDrivers['propel']);

$serviceTypes = [
'upload' => 0,
'inject' => 0,
'clean' => 50,
'remove' => 0,
];

foreach (array_keys($dbDrivers) as $driver) {
foreach ($serviceTypes as $serviceType => $priority) {
$this->createDoctrineListener($container, $serviceType, $driver, $priority);
}
}
}

protected function registerPropelListeners(ContainerBuilder $container, array $config)
{
$servicesMap = [
'inject_on_load' => ['name' => 'inject', 'priority' => 0],
'delete_on_update' => ['name' => 'clean', 'priority' => 50],
'delete_on_remove' => ['name' => 'remove', 'priority' => 0],
'inject_on_load' => 'inject',
'delete_on_update' => 'clean',
'delete_on_remove' => 'remove',
];

foreach ($config['mappings'] as $name => $mapping) {
$driver = $mapping['db_driver'];
if ('propel' !== $mapping['db_driver']) {
continue;
}

// create optional listeners
foreach ($servicesMap as $configOption => $service) {
foreach ($servicesMap as $configOption => $serviceType) {
if (!$mapping[$configOption]) {
continue;
}

$this->createListener($container, $name, $service['name'], $driver, $service['priority']);
$this->createPropelListener($container, $name, $serviceType);
}

// the upload listener is mandatory
$this->createListener($container, $name, 'upload', $driver);
$this->createPropelListener($container, $name, 'upload');
}
}

Expand All @@ -198,17 +223,26 @@ protected function createNamerService(ContainerBuilder $container, $mappingName,
return $mapping;
}

protected function createListener(ContainerBuilder $container, $name, $type, $driver, $priority = 0)
protected function createDoctrineListener(ContainerBuilder $container, $type, $driver, $priority = 0)
{
$definition = $container
->setDefinition(sprintf('vich_uploader.listener.%s.%s', $type, $name), new DefinitionDecorator(sprintf('vich_uploader.listener.%s.%s', $type, $driver)))
->replaceArgument(0, $name)
->getDefinition(sprintf('vich_uploader.listener.%s.%s', $type, $driver))
->replaceArgument(1, new Reference('vich_uploader.adapter.'.$driver));

// propel does not require tags to work
if (isset($this->tagMap[$driver])) {
$definition->addTag($this->tagMap[$driver], ['priority' => $priority]);
}
$definition->addTag($this->tagMap[$driver], ['priority' => $priority]);
}

protected function createPropelListener(ContainerBuilder $container, $name, $type)
{
$driver = 'propel';

$container
->setDefinition(
sprintf('vich_uploader.listener.%s.%s', $type, $name),
new DefinitionDecorator(sprintf('vich_uploader.listener.%s.%s', $type, $driver))
)
->replaceArgument(0, $name)
->replaceArgument(1, new Reference('vich_uploader.adapter.'.$driver));
}

private function registerFormTheme(ContainerBuilder $container)
Expand Down
54 changes: 9 additions & 45 deletions EventListener/Doctrine/BaseListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,79 +3,43 @@
namespace Vich\UploaderBundle\EventListener\Doctrine;

use Doctrine\Common\EventSubscriber;
use Vich\UploaderBundle\Adapter\AdapterInterface;
use Vich\UploaderBundle\Adapter\DoctrineAdapter;
use Vich\UploaderBundle\Handler\UploadHandler;
use Vich\UploaderBundle\Metadata\MetadataReader;
use Vich\UploaderBundle\Util\ClassUtils;

/**
* BaseListener.
*
* @author Konstantin Myakshin <koc-dp@yandex.ru>
* @author Kévin Gomez <contact@kevingomez.fr>
*/
abstract class BaseListener implements EventSubscriber
{
/**
* @var string
* @var array[]
*/
protected $mapping;
protected $mappings;

/**
* @var AdapterInterface
*/
protected $adapter;

/**
* @var MetadataReader
*/
protected $metadata;

/**
* @var UploadHandler
*/
protected $handler;

/**
* Constructs a new instance of UploaderListener.
*
* @param string $mapping The mapping name
* @param AdapterInterface $adapter The adapter
* @param MetadataReader $metadata The metadata reader
* @param UploadHandler $handler The upload handler
*/
public function __construct($mapping, AdapterInterface $adapter, MetadataReader $metadata, UploadHandler $handler)
public function __construct($mappings, DoctrineAdapter $adapter, MetadataReader $metadata, UploadHandler $handler)
{
$this->mapping = $mapping;
$this->mappings = $mappings;
$this->adapter = $adapter;
$this->metadata = $metadata;
$this->handler = $handler;
}

/**
* Checks if the given object is uploadable using the current mapping.
*
* @param mixed $object The object to test
*
* @return bool
*/
protected function isUploadable($object)
protected function isFlagEnabledForField($flag, array $field)
{
return $this->metadata->isUploadable(ClassUtils::getClass($object), $this->mapping);
return true === $this->mappings[$field['mapping']][$flag];
}

/**
* Returns a list of uploadable fields for the given object and mapping.
*
* @param mixed $object The object to use
*
* @return string[] A list of field names
*/
protected function getUploadableFields($object)
{
$fields = $this->metadata->getUploadableFields(ClassUtils::getClass($object), $this->mapping);

return array_map(function ($data) {
return $data['propertyName'];
}, $fields);
return $this->metadata->getUploadableFields(ClassUtils::getClass($object));
}
}
Loading