You are here

LocaleListener.php in Zircon Profile 8

Same filename and directory in other branches
  1. 8.0 vendor/symfony/http-kernel/EventListener/LocaleListener.php

File

vendor/symfony/http-kernel/EventListener/LocaleListener.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\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Initializes the locale based on the current request.
 *
 * This listener works in 2 modes:
 *
 *  * 2.3 compatibility mode where you must call setRequest whenever the Request changes.
 *  * 2.4+ mode where you must pass a RequestStack instance in the constructor.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class LocaleListener implements EventSubscriberInterface {
  private $router;
  private $defaultLocale;
  private $requestStack;

  /**
   * RequestStack will become required in 3.0.
   */
  public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null, RequestStack $requestStack = null) {
    $this->defaultLocale = $defaultLocale;
    $this->requestStack = $requestStack;
    $this->router = $router;
  }

  /**
   * Sets the current Request.
   *
   * This method was used to synchronize the Request, but as the HttpKernel
   * is doing that automatically now, you should never call it directly.
   * It is kept public for BC with the 2.3 version.
   *
   * @param Request|null $request A Request instance
   *
   * @deprecated since version 2.4, to be removed in 3.0.
   */
  public function setRequest(Request $request = null) {
    @trigger_error('The ' . __METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0.', E_USER_DEPRECATED);
    if (null === $request) {
      return;
    }
    $this
      ->setLocale($request);
    $this
      ->setRouterContext($request);
  }
  public function onKernelRequest(GetResponseEvent $event) {
    $request = $event
      ->getRequest();
    $request
      ->setDefaultLocale($this->defaultLocale);
    $this
      ->setLocale($request);
    $this
      ->setRouterContext($request);
  }
  public function onKernelFinishRequest(FinishRequestEvent $event) {
    if (null === $this->requestStack) {
      return;

      // removed when requestStack is required
    }
    if (null !== ($parentRequest = $this->requestStack
      ->getParentRequest())) {
      $this
        ->setRouterContext($parentRequest);
    }
  }
  private function setLocale(Request $request) {
    if ($locale = $request->attributes
      ->get('_locale')) {
      $request
        ->setLocale($locale);
    }
  }
  private function setRouterContext(Request $request) {
    if (null !== $this->router) {
      $this->router
        ->getContext()
        ->setParameter('_locale', $request
        ->getLocale());
    }
  }
  public static function getSubscribedEvents() {
    return array(
      // must be registered after the Router to have access to the _locale
      KernelEvents::REQUEST => array(
        array(
          'onKernelRequest',
          16,
        ),
      ),
      KernelEvents::FINISH_REQUEST => array(
        array(
          'onKernelFinishRequest',
          0,
        ),
      ),
    );
  }

}

Classes

Namesort descending Description
LocaleListener Initializes the locale based on the current request.