InlineFragmentRenderer.php

Namespace

Symfony\Component\HttpKernel\Fragment

File

drupal/core/vendor/symfony/http-kernel/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php
View source
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * Implements the inline rendering strategy where the Request is rendered by the current HTTP kernel.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InlineFragmentRenderer extends RoutableFragmentRenderer {
  private $kernel;
  private $dispatcher;

  /**
   * Constructor.
   *
   * @param HttpKernelInterface $kernel A HttpKernelInterface instance
   */
  public function __construct(HttpKernelInterface $kernel, EventDispatcherInterface $dispatcher = null) {
    $this->kernel = $kernel;
    $this->dispatcher = $dispatcher;
  }

  /**
   * {@inheritdoc}
   *
   * Additional available options:
   *
   *  * alt: an alternative URI to render in case of an error
   */
  public function render($uri, Request $request, array $options = array()) {
    $reference = null;
    if ($uri instanceof ControllerReference) {
      $reference = $uri;
      $uri = $this
        ->generateFragmentUri($uri, $request);
    }
    $subRequest = $this
      ->createSubRequest($uri, $request);

    // override Request attributes as they can be objects (which are not supported by the generated URI)
    if (null !== $reference) {
      $subRequest->attributes
        ->add($reference->attributes);
    }
    $level = ob_get_level();
    try {
      return $this->kernel
        ->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
    } catch (\Exception $e) {

      // we dispatch the exception event to trigger the logging
      // the response that comes back is simply ignored
      if (isset($options['ignore_errors']) && $options['ignore_errors'] && $this->dispatcher) {
        $event = new GetResponseForExceptionEvent($this->kernel, $request, HttpKernelInterface::SUB_REQUEST, $e);
        $this->dispatcher
          ->dispatch(KernelEvents::EXCEPTION, $event);
      }

      // let's clean up the output buffers that were created by the sub-request
      while (ob_get_level() > $level) {
        ob_get_clean();
      }
      if (isset($options['alt'])) {
        $alt = $options['alt'];
        unset($options['alt']);
        return $this
          ->render($alt, $request, $options);
      }
      if (!isset($options['ignore_errors']) || !$options['ignore_errors']) {
        throw $e;
      }
      return new Response();
    }
  }
  protected function createSubRequest($uri, Request $request) {
    $cookies = $request->cookies
      ->all();
    $server = $request->server
      ->all();

    // Override the arguments to emulate a sub-request.
    // Sub-request object will point to localhost as client ip and real client ip
    // will be included into trusted header for client ip
    try {
      $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
      $currentXForwardedFor = $request->headers
        ->get($trustedHeaderName, '');
      $server['HTTP_' . $trustedHeaderName] = ($currentXForwardedFor ? $currentXForwardedFor . ', ' : '') . $request
        ->getClientIp();
    } catch (\InvalidArgumentException $e) {

      // Do nothing
    }
    $server['REMOTE_ADDR'] = '127.0.0.1';
    $subRequest = $request::create($uri, 'get', array(), $cookies, array(), $server);
    if ($request->headers
      ->has('Surrogate-Capability')) {
      $subRequest->headers
        ->set('Surrogate-Capability', $request->headers
        ->get('Surrogate-Capability'));
    }
    if ($session = $request
      ->getSession()) {
      $subRequest
        ->setSession($session);
    }
    return $subRequest;
  }

  /**
   * {@inheritdoc}
   */
  public function getName() {
    return 'inline';
  }

}

Classes

Namesort descending Description
InlineFragmentRenderer Implements the inline rendering strategy where the Request is rendered by the current HTTP kernel.