class FileEntityNormalizer in Replication 8
Same name and namespace in other branches
- 8.2 src/Normalizer/FileEntityNormalizer.php \Drupal\replication\Normalizer\FileEntityNormalizer
Hierarchy
- class \Drupal\serialization\Normalizer\NormalizerBase implements \Symfony\Component\Serializer\SerializerAwareInterface, CacheableNormalizerInterface uses \Symfony\Component\Serializer\SerializerAwareTrait
- class \Drupal\replication\Normalizer\ContentEntityNormalizer implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface uses FieldableEntityNormalizerTrait
- class \Drupal\replication\Normalizer\FileEntityNormalizer implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface
- class \Drupal\replication\Normalizer\ContentEntityNormalizer implements \Symfony\Component\Serializer\Normalizer\DenormalizerInterface uses FieldableEntityNormalizerTrait
Expanded class hierarchy of FileEntityNormalizer
1 string reference to 'FileEntityNormalizer'
1 service uses FileEntityNormalizer
File
- src/
Normalizer/ FileEntityNormalizer.php, line 16
Namespace
Drupal\replication\NormalizerView source
class FileEntityNormalizer extends ContentEntityNormalizer implements DenormalizerInterface {
/**
* @var string[]
*/
protected $supportedInterfaceOrClass = [
'Drupal\\file\\FileInterface',
];
/**
* @var string[]
*/
protected $format = [
'json',
];
/**
* @var \Drupal\replication\ProcessFileAttachment
*/
protected $processFileAttachment;
/**
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
* @param \Drupal\multiversion\Entity\Index\MultiversionIndexFactory $index_factory
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* @param \Drupal\replication\UsersMapping $users_mapping
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* @param \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface $selection_manager
* @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
* @param \Drupal\replication\ProcessFileAttachment $process_file_attachment
*/
public function __construct(EntityManagerInterface $entity_manager, MultiversionIndexFactory $index_factory, LanguageManagerInterface $language_manager, UsersMapping $users_mapping, ModuleHandlerInterface $module_handler, SelectionPluginManagerInterface $selection_manager = NULL, EventDispatcherInterface $event_dispatcher = NULL, ProcessFileAttachment $process_file_attachment) {
parent::__construct($entity_manager, $index_factory, $language_manager, $users_mapping, $module_handler, $selection_manager, $event_dispatcher);
$this->processFileAttachment = $process_file_attachment;
}
/**
* {@inheritdoc}
*/
public function normalize($data, $format = NULL, array $context = []) {
$normalized = parent::normalize($data, $format, $context);
$file_system = \Drupal::service('file_system');
$uri = $data
->getFileUri();
if (empty($uri)) {
return $normalized;
}
if ($file_contents = @file_get_contents($uri)) {
if (in_array($file_system
->uriScheme($uri), [
'public',
'private',
]) == FALSE) {
$file_data = '';
}
else {
$file_data = base64_encode($file_contents);
}
// @todo {@link https://www.drupal.org/node/2600360 Add revpos and other missing properties to the result array.}
$normalized['@attachment'] = [
'uuid' => $data
->uuid(),
'uri' => $uri,
'content_type' => $data
->getMimeType(),
'digest' => 'md5-' . base64_encode(md5($file_contents)),
'length' => $data
->getSize(),
'data' => $file_data,
];
}
return $normalized;
}
/**
* {@inheritdoc}
*/
public function denormalize($data, $class, $format = NULL, array $context = []) {
$file = NULL;
if (!empty($data['@attachment']['uuid'])) {
$workspace = isset($context['workspace']) ? $context['workspace'] : NULL;
/** @var FileInterface $file */
if ($file = $this->processFileAttachment
->process($data['@attachment'], 'base64_stream', $workspace)) {
// Update the data, because file name could change.
$language_code = $file
->language()
->getId();
$data[$language_code]['filename'][0]['value'] = $file
->get('filename')->value;
$data[$language_code]['uri'][0]['value'] = $file
->get('uri')->value;
}
unset($data['@attachment']);
}
return parent::denormalize($data, $class, $format, $context);
}
public function supportsDenormalization($data, $type, $format = NULL) {
// We need to accept both FileInterface and ContentEntityInterface classes.
// File entities are treated as standard content entities.
if (in_array($type, [
'Drupal\\Core\\Entity\\ContentEntityInterface',
'Drupal\\file\\FileInterface',
], TRUE)) {
// If a document has _attachment then we assume it's a file entity.
if (!empty($data['@attachment'])) {
return TRUE;
}
}
return FALSE;
}
}