Developer Information

Asset Usage Strategies

It is possible to extend the media handling by defining asset usage strategies. Those strategies can tell the media package if an asset is in used, how many times it is used and how it is used.

An asset usage strategy is already implemented for Neos ContentRepository nodes under the sites root, like document and content nodes. For all other usage scenarios, you need to build your own strategy.

To define your own custom usage strategy you have to implement the Neos\Media\Domain\Strategy\AssetUsageStrategyInterface. For convenience you can extend the Neos\Media\Domain\Strategy\AbstractAssetUsageStrategy.

Example Strategy

use TYPO3\Flow\Annotations as Flow;
use Neos\Media\Domain\Strategy\AbstractAssetUsageStrategy;
use TYPO3\Flow\Persistence\PersistenceManagerInterface;

/**
 * @Flow\Scope("singleton")
 */
class MyCustomAssetUsageStrategy extends AbstractAssetUsageStrategy
{
    /**
     * @Flow\Inject
     * @var PersistenceManagerInterface
     */
    protected $persistenceManager;

    /**
     * @var array
     */
    protected $firstlevelCache = [];

    /**
     * Returns an array of usage reference objects.
     *
     * @param AssetInterface $asset
     * @return array<\Neos\Media\Domain\Model\Dto\UsageReference>
     */
    public function getUsageReferences(AssetInterface $asset)
    {
        $assetIdentifier = $this->persistenceManager->getIdentifierByObject($asset);
        if (isset($this->firstlevelCache[$assetIdentifier])) {
            return $this->firstlevelCache[$assetIdentifier];
        }

        // Your code to find asset usage
        foreach ($usages as $usage) {
            $this->firstlevelCache[$assetIdentifier] = new \Neos\Media\Domain\Model\Dto\UsageReference($asset);
        }

        return $this->firstlevelCache[$assetIdentifier];
    }
}

Extend Asset Validation

Imagine you need to extend the validation of assets. For example to prevent duplicate file names or to run copyright checks on images. You can do so by creating your own custom validator. If you make sure that your validator implements the \Neos\Media\Domain\Validator\AssetValidatorInterface it will be loaded on object validation. The added errors in your validator will be merged into the model validator of assets.

Example validator

<?php
namespace My\Package;

use TYPO3\Flow\Validation\Valwidator\AbstractValidator;
use Neos\Media\Domain\Model\AssetInterface;
use Neos\Media\Domain\Validator\AssetValidatorInterface;

class CustomValidator extends AbstractValidator implements AssetValidatorInterface
{

    /**
     * Check if $value is valid. If it is not valid, needs to add an error
     * to the result.
     *
     * @param AssetInterface $value
     * @return void
     */
    protected function isValid($value)
    {
        // Your object validation
        if ($errors) {
            $this->addError('Some error', 0123456789);
        }
    }
}