Skip to content
MultiresponseNormalizer.php 1.36 KiB
Newer Older
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
<?php

namespace Drupal\subrequests\Normalizer;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

/**
 * Normalizes multiple response objects into a single string.
 */
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
class MultiresponseNormalizer implements NormalizerInterface {

  /**
   * {@inheritdoc}
   */
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
  public function normalize($object, $format = NULL, array $context = []) {
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
    $delimiter = $context['delimiter'];
    $separator = sprintf("\r\n--%s\r\n", $delimiter);
    // Join the content responses with the separator.
    $content_items = array_map(function (Response $part_response) {
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
      $part_response->headers->set('Status', $part_response->getStatusCode());
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
      return sprintf(
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
        $part_response->headers,
        $part_response->getContent()
      );
    }, (array) $object);
    return sprintf("--%s\r\n", $delimiter) . implode($separator, $content_items) . sprintf("\r\n--%s--", $delimiter);
  }

  /**
   * {@inheritdoc}
   */
  public function supportsNormalization($data, $format = NULL) {
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
    if ($format !== 'multipart-related') {
Mateu Aguiló Bosch's avatar
Mateu Aguiló Bosch committed
      return FALSE;
    }
    if (!is_array($data)) {
      return FALSE;
    }
    $responses = array_filter($data, function ($response) {
      return $response instanceof Response;
    });
    if (count($responses) !== count($data)) {
      return FALSE;
    }
    return TRUE;
  }

}