/** * Load a resource into a object property and return instance of resource * * @param object $context object to inject the resource * @param string $property property to use, should have a valid resource annotation * @param File $file instance of file to inject * @param EntityManager $em Entity manager instance, required in case of load the resource manually * * @return ResourceObjectInterface the resource object instance * @throws \Exception */ public function load(&$context, $property, File $file, EntityManager $em = null) { $accessor = new PropertyAccessor(); if (($resource = $accessor->getValue($context, $property)) && $resource instanceof ResourceObjectInterface) { $resource->setFile($file); //update //delete any existent if ($resource->getId() && $resource->getMapping() && $resource->getLocation()) { $previousResolverName = $this->getLocationConfig('resolver', $resource->getLocation(), $this->config); $previousResolver = $this->resolverManager->get($previousResolverName); $previousResolver->setConfig($this->config); $previousResolver->deleteFile($resource); } } else { /** @var ResourceObjectInterface $resource */ $resource = new $this->class(); //create $resource->setFile($file); } if (null === ($config = $this->getPropertyConfig($context, $property))) { $message = sprintf('Can not create resource for %s in %s. Invalid object or annotation is missing.', $property, $context); throw new \LogicException($message); } //new file settings $resource->setMapping($config->getMapping()); $resource->setUpdated(new \DateTime()); $resource->setSize($file->getSize()); $resource->setMimeType($file->getMimeType()); if (isset($this->config['mappings'][$config->getMapping()]['location'])) { $resource->setLocation($this->config['mappings'][$config->getMapping()]['location']); } else { $resource->setLocation($this->config['default_location']); } $resolverName = $this->getLocationConfig('resolver', $resource->getLocation(), $this->config); $resolver = $this->resolverManager->get($resolverName); $resolver->setConfig($this->config); $resourceMapping = $this->getResourceMapping($this->config, $resource); if (isset($resourceMapping['relative_path']) && ($relativePath = $resourceMapping['relative_path'])) { $relativePath = $this->parseName($relativePath, $context, $property); $resource->setRelativePath($relativePath); } foreach ($this->transformerManager->getAll() as $transformer) { if ($transformer->supports($resource->getFile(), $config)) { $file = $transformer->transform($resource->getFile(), $config); $resource->setFile($file); } } $this->setResourceName($resource, $property, $context); //save $resolver->saveFile($resource); $resource->setUrl($resolver->getUrl($resource)); $accessor->setValue($context, $property, $resource); if ($em) { //prepare the listener to listen any save operation after resource load $updater = new ResourceLoaderListener($this, $context, $property, $resource->getFile()); $em->getEventManager()->addEventListener([Events::postPersist, Events::preUpdate], $updater); } return $resource; }
/** * loadResource * * @param ResourceObjectInterface $resource * * @throws \Exception */ protected function loadResource(ResourceObjectInterface $resource) { $resolverName = $this->getLocationConfig('resolver', $resource->getLocation(), $this->config); $resolver = $this->resolverManager->get($resolverName); $resolver->setConfig($this->config); $resource->setFile($resolver->getFile($resource)); $resource->setUrl($resolver->getUrl($resource)); }