FrontController.php in Subrequests 8        
                          
                  
                        
  
  
  
  
File
  src/Controller/FrontController.php
  
    View source  
  <?php
namespace Drupal\subrequests\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\subrequests\Blueprint\Parser;
use Drupal\subrequests\Blueprint\RequestTree;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class FrontController extends ControllerBase {
  
  protected $parser;
  
  protected $httpKernel;
  
  public function __construct(Parser $parser, HttpKernelInterface $http_kernel) {
    $this->parser = $parser;
    $this->httpKernel = $http_kernel;
  }
  
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('subrequests.blueprint_parser'), $container
      ->get('http_kernel'));
  }
  
  public function handle(Request $request) {
    $this->parser
      ->parseRequest($request);
    $responses = [];
    
    $root_tree = $request->attributes
      ->get(RequestTree::SUBREQUEST_TREE);
    $trees = [
      $root_tree,
    ];
    
    while (!$root_tree
      ->isDone()) {
      
      array_walk($trees, function (RequestTree $tree) use ($responses) {
        $tree
          ->dereference($responses);
      });
      
      $requests = array_reduce($trees, function (array $carry, RequestTree $tree) {
        return array_merge($carry, $tree
          ->getRequests());
      }, []);
      
      $trees = array_reduce($trees, function (array $carry, RequestTree $tree) {
        return array_merge($carry, $tree
          ->getSubTrees());
      }, []);
      
      $level_responses = array_map(function (Request $request) {
        $response = $this->httpKernel
          ->handle($request, HttpKernelInterface::MASTER_REQUEST);
        
        $request->attributes
          ->set(RequestTree::SUBREQUEST_DONE, TRUE);
        $id = $request->headers
          ->get('Content-ID');
        $response->headers
          ->set('Content-ID', $id);
        return $response;
      }, $requests);
      $responses = array_merge($responses, $level_responses);
    }
    return $this->parser
      ->combineResponses($responses);
  }
}