[ Index ]

PHP Cross Reference of phpBB-3.3.14-deutsch

title

Body

[close]

/vendor/symfony/http-kernel/Fragment/ -> AbstractSurrogateFragmentRenderer.php (source)

   1  <?php
   2  
   3  /*
   4   * This file is part of the Symfony package.
   5   *
   6   * (c) Fabien Potencier <fabien@symfony.com>
   7   *
   8   * For the full copyright and license information, please view the LICENSE
   9   * file that was distributed with this source code.
  10   */
  11  
  12  namespace Symfony\Component\HttpKernel\Fragment;
  13  
  14  use Symfony\Component\HttpFoundation\Request;
  15  use Symfony\Component\HttpFoundation\Response;
  16  use Symfony\Component\HttpKernel\Controller\ControllerReference;
  17  use Symfony\Component\HttpKernel\HttpCache\SurrogateInterface;
  18  use Symfony\Component\HttpKernel\UriSigner;
  19  
  20  /**
  21   * Implements Surrogate rendering strategy.
  22   *
  23   * @author Fabien Potencier <fabien@symfony.com>
  24   */
  25  abstract class AbstractSurrogateFragmentRenderer extends RoutableFragmentRenderer
  26  {
  27      private $surrogate;
  28      private $inlineStrategy;
  29      private $signer;
  30  
  31      /**
  32       * The "fallback" strategy when surrogate is not available should always be an
  33       * instance of InlineFragmentRenderer.
  34       *
  35       * @param SurrogateInterface        $surrogate      An Surrogate instance
  36       * @param FragmentRendererInterface $inlineStrategy The inline strategy to use when the surrogate is not supported
  37       * @param UriSigner                 $signer
  38       */
  39      public function __construct(SurrogateInterface $surrogate = null, FragmentRendererInterface $inlineStrategy, UriSigner $signer = null)
  40      {
  41          $this->surrogate = $surrogate;
  42          $this->inlineStrategy = $inlineStrategy;
  43          $this->signer = $signer;
  44      }
  45  
  46      /**
  47       * {@inheritdoc}
  48       *
  49       * Note that if the current Request has no surrogate capability, this method
  50       * falls back to use the inline rendering strategy.
  51       *
  52       * Additional available options:
  53       *
  54       *  * alt: an alternative URI to render in case of an error
  55       *  * comment: a comment to add when returning the surrogate tag
  56       *
  57       * Note, that not all surrogate strategies support all options. For now
  58       * 'alt' and 'comment' are only supported by ESI.
  59       *
  60       * @see Symfony\Component\HttpKernel\HttpCache\SurrogateInterface
  61       */
  62      public function render($uri, Request $request, array $options = [])
  63      {
  64          if (!$this->surrogate || !$this->surrogate->hasSurrogateCapability($request)) {
  65              if ($uri instanceof ControllerReference && $this->containsNonScalars($uri->attributes)) {
  66                  @trigger_error('Passing non-scalar values as part of URI attributes to the ESI and SSI rendering strategies is deprecated since Symfony 3.1, and will be removed in 4.0. Use a different rendering strategy or pass scalar values.', \E_USER_DEPRECATED);
  67              }
  68  
  69              return $this->inlineStrategy->render($uri, $request, $options);
  70          }
  71  
  72          if ($uri instanceof ControllerReference) {
  73              $uri = $this->generateSignedFragmentUri($uri, $request);
  74          }
  75  
  76          $alt = isset($options['alt']) ? $options['alt'] : null;
  77          if ($alt instanceof ControllerReference) {
  78              $alt = $this->generateSignedFragmentUri($alt, $request);
  79          }
  80  
  81          $tag = $this->surrogate->renderIncludeTag($uri, $alt, isset($options['ignore_errors']) ? $options['ignore_errors'] : false, isset($options['comment']) ? $options['comment'] : '');
  82  
  83          return new Response($tag);
  84      }
  85  
  86      private function generateSignedFragmentUri($uri, Request $request)
  87      {
  88          if (null === $this->signer) {
  89              throw new \LogicException('You must use a URI when using the ESI rendering strategy or set a URL signer.');
  90          }
  91  
  92          // we need to sign the absolute URI, but want to return the path only.
  93          $fragmentUri = $this->signer->sign($this->generateFragmentUri($uri, $request, true));
  94  
  95          return substr($fragmentUri, \strlen($request->getSchemeAndHttpHost()));
  96      }
  97  
  98      private function containsNonScalars(array $values)
  99      {
 100          foreach ($values as $value) {
 101              if (\is_array($value)) {
 102                  return $this->containsNonScalars($value);
 103              } elseif (!is_scalar($value) && null !== $value) {
 104                  return true;
 105              }
 106          }
 107  
 108          return false;
 109      }
 110  }


Generated: Mon Nov 25 19:05:08 2024 Cross-referenced by PHPXref 0.7.1