Pass the _content callback as a proper controller through HttpKernel::forward().
parent
f6bf963097
commit
867e7707f5
|
@ -10,6 +10,7 @@ namespace Drupal\Core\EventSubscriber;
|
|||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpKernel\KernelEvents;
|
||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
|
||||
|
@ -44,15 +45,25 @@ class ViewSubscriber implements EventSubscriberInterface {
|
|||
*/
|
||||
public function onView(GetResponseForControllerResultEvent $event) {
|
||||
|
||||
$request = $event->getRequest();
|
||||
// For a master request, we process the result and wrap it as needed.
|
||||
// For a subrequest, all we want is the string value. We assume that
|
||||
// is just an HTML string from a controller, so wrap that into a response
|
||||
// object. The subrequest's response will get dissected and placed into
|
||||
// the larger page as needed.
|
||||
if ($event->getRequestType() == HttpKernelInterface::MASTER_REQUEST) {
|
||||
$request = $event->getRequest();
|
||||
|
||||
$method = 'on' . $this->negotiation->getContentType($request);
|
||||
$method = 'on' . $this->negotiation->getContentType($request);
|
||||
|
||||
if (method_exists($this, $method)) {
|
||||
$event->setResponse($this->$method($event));
|
||||
if (method_exists($this, $method)) {
|
||||
$event->setResponse($this->$method($event));
|
||||
}
|
||||
else {
|
||||
$event->setResponse(new Response('Unsupported Media Type', 415));
|
||||
}
|
||||
}
|
||||
else {
|
||||
$event->setResponse(new Response('Unsupported Media Type', 415));
|
||||
$event->setResponse(new Response($event->getControllerResult()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,11 +22,20 @@ class HtmlPageController implements ContainerAwareInterface {
|
|||
|
||||
public function content(Request $request, $_content) {
|
||||
|
||||
$content_controller = $this->getContentController($_content);
|
||||
// @todo When we have a Generator, we can replace the forward() call with
|
||||
// a render() call, which would handle ESI and hInclude as well. That will
|
||||
// require an _internal route. For examples, see:
|
||||
// https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/internal.xml
|
||||
// https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Controller/InternalController.php
|
||||
$attributes = $request->attributes;
|
||||
$controller = $attributes->get('_content');
|
||||
$attributes->remove('system_path');
|
||||
$attributes->remove('_content');
|
||||
$response = $this->container->get('http_kernel')->forward($controller, $attributes->all(), $request->query->all());
|
||||
|
||||
$page_callback_result = call_user_func_array($content_controller, array());
|
||||
$page_content = $response->getContent();
|
||||
|
||||
return new Response(drupal_render_page($page_callback_result));
|
||||
return new Response(drupal_render_page($page_content));
|
||||
}
|
||||
|
||||
protected function getContentController($controller) {
|
||||
|
|
Loading…
Reference in New Issue