vendor/contao/core-bundle/src/Resources/contao/library/Contao/Session.php line 17

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Contao.
  4.  *
  5.  * (c) Leo Feyer
  6.  *
  7.  * @license LGPL-3.0-or-later
  8.  */
  9. namespace Contao;
  10. use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
  11. use Symfony\Component\HttpFoundation\Session\Session as SymfonySession;
  12. use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
  13. @trigger_error('Using the "Contao\Session" class has been deprecated and will no longer work in Contao 5.0. Use the session service instead.'E_USER_DEPRECATED);
  14. /**
  15.  * Handles reading and updating the session data
  16.  *
  17.  * The class functions as an adapter for the PHP $_SESSION array and separates
  18.  * back end from front end session data.
  19.  *
  20.  * Usage:
  21.  *
  22.  *     $session = Session::getInstance();
  23.  *     $session->set('foo', 'bar');
  24.  *     echo $session->get('foo');
  25.  *
  26.  * @author Leo Feyer <https://github.com/leofeyer>
  27.  *
  28.  * @deprecated Deprecated since Contao 4.0, to be removed in Contao 5.0.
  29.  *             Use the session service instead.
  30.  */
  31. class Session
  32. {
  33.     /**
  34.      * Object instance (Singleton)
  35.      * @var Session
  36.      */
  37.     protected static $objInstance;
  38.     /**
  39.      * Symfony session object
  40.      * @var SymfonySession
  41.      */
  42.     private $session;
  43.     /**
  44.      * Symfony session bag
  45.      * @var AttributeBagInterface
  46.      */
  47.     private $sessionBag;
  48.     /**
  49.      * Session keys that are not stored in the parameter bag
  50.      * @var array
  51.      */
  52.     private static $mappedKeys = array('referer''popupReferer''CURRENT_ID');
  53.     /**
  54.      * Get the session data
  55.      */
  56.     protected function __construct()
  57.     {
  58.         if (\PHP_SAPI == 'cli')
  59.         {
  60.             $this->session = new SymfonySession(new MockArraySessionStorage());
  61.         }
  62.         else
  63.         {
  64.             $this->session System::getContainer()->get('session');
  65.         }
  66.         $this->sessionBag $this->session->getBag($this->getSessionBagKey());
  67.     }
  68.     /**
  69.      * Prevent cloning of the object (Singleton)
  70.      */
  71.     final public function __clone()
  72.     {
  73.     }
  74.     /**
  75.      * Return the object instance (Singleton)
  76.      *
  77.      * @return Session The object instance
  78.      */
  79.     public static function getInstance()
  80.     {
  81.         if (static::$objInstance === null)
  82.         {
  83.             static::$objInstance = new static();
  84.         }
  85.         return static::$objInstance;
  86.     }
  87.     /**
  88.      * Return a session variable
  89.      *
  90.      * @param string $strKey The variable name
  91.      *
  92.      * @return mixed The variable value
  93.      */
  94.     public function get($strKey)
  95.     {
  96.         // Map the referer (see #281)
  97.         if (\in_array($strKeyself::$mappedKeys))
  98.         {
  99.             return $this->session->get($strKey);
  100.         }
  101.         return $this->sessionBag->get($strKey);
  102.     }
  103.     /**
  104.      * Set a session variable
  105.      *
  106.      * @param string $strKey   The variable name
  107.      * @param mixed  $varValue The variable value
  108.      */
  109.     public function set($strKey$varValue)
  110.     {
  111.         // Map the referer (see #281)
  112.         if (\in_array($strKeyself::$mappedKeys))
  113.         {
  114.             $this->session->set($strKey$varValue);
  115.         }
  116.         else
  117.         {
  118.             $this->sessionBag->set($strKey$varValue);
  119.         }
  120.     }
  121.     /**
  122.      * Remove a session variable
  123.      *
  124.      * @param string $strKey The variable name
  125.      */
  126.     public function remove($strKey)
  127.     {
  128.         // Map the referer (see #281)
  129.         if (\in_array($strKeyself::$mappedKeys))
  130.         {
  131.             $this->session->remove($strKey);
  132.         }
  133.         else
  134.         {
  135.             $this->sessionBag->remove($strKey);
  136.         }
  137.     }
  138.     /**
  139.      * Return the session data as array
  140.      *
  141.      * @return array The session data
  142.      */
  143.     public function getData()
  144.     {
  145.         $data $this->sessionBag->all();
  146.         // Map the referer (see #281)
  147.         foreach (self::$mappedKeys as $strKey)
  148.         {
  149.             unset($data[$strKey]);
  150.             if ($this->session->has($strKey))
  151.             {
  152.                 $data[$strKey] = $this->session->get($strKey);
  153.             }
  154.         }
  155.         return $data;
  156.     }
  157.     /**
  158.      * Set the session data from an array
  159.      *
  160.      * @param array $arrData The session data
  161.      *
  162.      * @throws \Exception If $arrData is not an array
  163.      */
  164.     public function setData($arrData)
  165.     {
  166.         if (!\is_array($arrData))
  167.         {
  168.             throw new \Exception('Array required to set session data');
  169.         }
  170.         // Map the referer (see #281)
  171.         foreach (self::$mappedKeys as $strKey)
  172.         {
  173.             if (isset($arrData[$strKey]))
  174.             {
  175.                 $this->session->set($strKey$arrData[$strKey]);
  176.                 unset($arrData[$strKey]);
  177.             }
  178.         }
  179.         $this->sessionBag->replace($arrData);
  180.     }
  181.     /**
  182.      * Append data to the session
  183.      *
  184.      * @param mixed $varData The data object or array
  185.      *
  186.      * @throws \Exception If $varData is not an array or object
  187.      */
  188.     public function appendData($varData)
  189.     {
  190.         if (\is_object($varData))
  191.         {
  192.             $varData get_object_vars($varData);
  193.         }
  194.         if (!\is_array($varData))
  195.         {
  196.             throw new \Exception('Array or object required to append session data');
  197.         }
  198.         foreach ($varData as $k=>$v)
  199.         {
  200.             // Map the referer (see #281)
  201.             if (\in_array($kself::$mappedKeys))
  202.             {
  203.                 $this->session->set($k$v);
  204.             }
  205.             else
  206.             {
  207.                 $this->sessionBag->set($k$v);
  208.             }
  209.         }
  210.     }
  211.     /**
  212.      * Gets the correct session bag key depending on the Contao environment
  213.      *
  214.      * @return string
  215.      */
  216.     private function getSessionBagKey()
  217.     {
  218.         switch (TL_MODE)
  219.         {
  220.             case 'BE':
  221.                 return 'contao_backend';
  222.             case 'FE':
  223.                 return 'contao_frontend';
  224.             default:
  225.                 return 'attributes';
  226.         }
  227.     }
  228. }
  229. class_alias(Session::class, 'Session');