Neos\Media\Domain\Service\AssetService::replaceAssetResource PHP Метод

replaceAssetResource() публичный Метод

Replace resource on an asset. Takes variants and redirect handling into account.
public replaceAssetResource ( Neos\Media\Domain\Model\AssetInterface $asset, PersistentResource $resource, array $options = [] ) : void
$asset Neos\Media\Domain\Model\AssetInterface
$resource Neos\Flow\ResourceManagement\PersistentResource
$options array
Результат void
    public function replaceAssetResource(AssetInterface $asset, PersistentResource $resource, array $options = [])
    {
        $originalAssetResource = $asset->getResource();
        $asset->setResource($resource);
        if (isset($options['keepOriginalFilename']) && (bool) $options['keepOriginalFilename'] === true) {
            $asset->getResource()->setFilename($originalAssetResource->getFilename());
        }
        $uriMapping = [];
        $redirectHandlerEnabled = isset($options['generateRedirects']) && (bool) $options['generateRedirects'] === true && $this->packageManager->isPackageAvailable('Neos.RedirectHandler');
        if ($redirectHandlerEnabled) {
            $uriMapping[$this->resourceManager->getPublicPersistentResourceUri($originalAssetResource)] = $this->resourceManager->getPublicPersistentResourceUri($asset->getResource());
        }
        if (method_exists($asset, 'getVariants')) {
            $variants = $asset->getVariants();
            /** @var AssetVariantInterface $variant */
            foreach ($variants as $variant) {
                $originalVariantResource = $variant->getResource();
                $variant->refresh();
                if (method_exists($variant, 'getAdjustments')) {
                    foreach ($variant->getAdjustments() as $adjustment) {
                        if (method_exists($adjustment, 'refit')) {
                            $adjustment->refit($asset);
                        }
                    }
                }
                if ($redirectHandlerEnabled) {
                    $uriMapping[$this->resourceManager->getPublicPersistentResourceUri($originalVariantResource)] = $this->resourceManager->getPublicPersistentResourceUri($variant->getResource());
                }
                $this->getRepository($variant)->update($variant);
            }
        }
        if ($redirectHandlerEnabled) {
            /** @var \Neos\RedirectHandler\Storage\RedirectStorageInterface $redirectStorage */
            $redirectStorage = $this->objectManager->get(\Neos\RedirectHandler\Storage\RedirectStorageInterface::class);
            foreach ($uriMapping as $originalUri => $newUri) {
                $existingRedirect = $redirectStorage->getOneBySourceUriPathAndHost($originalUri);
                if ($existingRedirect === null) {
                    $redirectStorage->addRedirect($originalUri, $newUri, 301);
                }
            }
        }
        $this->getRepository($asset)->update($asset);
        $this->emitAssetResourceReplaced($asset);
    }

Usage Example

 /**
  * Replace the resource on an asset.
  *
  * @param AssetInterface $asset
  * @param PersistentResource $resource
  * @param array $options
  * @return void
  */
 public function updateAssetResourceAction(AssetInterface $asset, PersistentResource $resource, array $options = [])
 {
     try {
         $originalFilename = $asset->getLabel();
         $this->assetService->replaceAssetResource($asset, $resource, $options);
     } catch (\Exception $exception) {
         $this->addFlashMessage('couldNotReplaceAsset', '', Message::SEVERITY_OK, [], 1463472606);
         $this->forwardToReferringRequest();
     }
     $this->addFlashMessage('assetHasBeenReplaced', '', Message::SEVERITY_OK, [htmlspecialchars($originalFilename)]);
     $this->redirect('index');
 }