/** * {@inheritdoc} */ public function process(ContainerBuilder $container) { if (!$container->hasParameter('vich_uploader.mappings')) { return; } $serviceTypes = array('inject', 'clean', 'remove', 'upload'); $metadata = $container->get('vich_uploader.metadata_reader'); $mappings = $container->getParameter('vich_uploader.mappings'); foreach ($metadata->getUploadableClasses() as $class) { foreach ($metadata->getUploadableFields($class) as $field) { if (empty($mappings[$field['mapping']])) { throw MappingNotFoundException::createNotFoundForClassAndField($field['mapping'], $class, $field['propertyName']); } $mapping = $mappings[$field['mapping']]; if ($mapping['db_driver'] !== 'propel') { continue; } foreach ($serviceTypes as $type) { if (!$container->has(sprintf('vich_uploader.listener.%s.%s', $type, $field['mapping']))) { continue; } $definition = $container->getDefinition(sprintf('vich_uploader.listener.%s.%s', $type, $field['mapping'])); $definition->setClass($container->getDefinition($definition->getParent())->getClass()); $definition->setPublic(true); $definition->addTag('propel.event_subscriber', array('class' => $class)); } } } }
/** * Creates the property mapping from the read annotation and configured mapping. * * @param object $obj The object. * @param string $fieldName The field name. * @param array $mappingData The mapping data. * * @return PropertyMapping The property mapping. * @throws MappingNotFoundException */ protected function createMapping($obj, $fieldName, array $mappingData) { if (!array_key_exists($mappingData['mapping'], $this->mappings)) { throw MappingNotFoundException::createNotFoundForClassAndField($mappingData['mapping'], $this->getClassName($obj), $fieldName); } $config = $this->mappings[$mappingData['mapping']]; $fileProperty = isset($mappingData['propertyName']) ? $mappingData['propertyName'] : $fieldName; $fileNameProperty = empty($mappingData['fileNameProperty']) ? $fileProperty . $this->defaultFilenameAttributeSuffix : $mappingData['fileNameProperty']; $mapping = new PropertyMapping($fileProperty, $fileNameProperty); $mapping->setMappingName($mappingData['mapping']); $mapping->setMapping($config); if ($config['namer']['service']) { $namerConfig = $config['namer']; $namer = $this->container->get($namerConfig['service']); if (!empty($namerConfig['options']) && $namer instanceof ConfigurableInterface) { $namer->configure($namerConfig['options']); } else { if (!empty($namerConfig['options']) && !$namer instanceof ConfigurableInterface) { throw new \LogicException(sprintf('Namer %s can not receive options as it does not implement ConfigurableInterface.', $namerConfig['service'])); } } $mapping->setNamer($namer); } if ($config['directory_namer']) { $mapping->setDirectoryNamer($this->container->get($config['directory_namer'])); } return $mapping; }