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);
}
}