This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
symfony/src/Symfony/Component/HttpFoundation/Session.php
Fabien Potencier 74bc699b27 moved management of the locale from the Session class to the Request class
The locale management does not require sessions anymore.

In the Symfony2 spirit, the locale should be part of your URLs. If this is the case
(via the special _locale request attribute), Symfony will store it in the request
(getLocale()).

This feature is now also configurable/replaceable at will as everything is now managed
by the new LocaleListener event listener.

How to upgrade:

The default locale configuration has been moved from session to the main configuration:

Before:

framework:
    session:
        default_locale: en

After:

framework:
    default_locale: en

Whenever you want to get the current locale, call getLocale() on the request (was on the
session before).
2011-10-08 18:34:49 +02:00

359 lines
7.1 KiB
PHP

<?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\HttpFoundation;
use Symfony\Component\HttpFoundation\SessionStorage\SessionStorageInterface;
/**
* Session.
*
* @author Fabien Potencier <fabien@symfony.com>
*
* @api
*/
class Session implements \Serializable
{
protected $storage;
protected $started;
protected $attributes;
protected $flashes;
protected $oldFlashes;
protected $closed;
/**
* Constructor.
*
* @param SessionStorageInterface $storage A SessionStorageInterface instance
*/
public function __construct(SessionStorageInterface $storage)
{
$this->storage = $storage;
$this->flashes = array();
$this->oldFlashes = array();
$this->attributes = array();
$this->started = false;
$this->closed = false;
}
/**
* Starts the session storage.
*
* @api
*/
public function start()
{
if (true === $this->started) {
return;
}
$this->storage->start();
$attributes = $this->storage->read('_symfony2');
if (isset($attributes['attributes'])) {
$this->attributes = $attributes['attributes'];
$this->flashes = $attributes['flashes'];
// flag current flash messages to be removed at shutdown
$this->oldFlashes = $this->flashes;
}
$this->started = true;
}
/**
* Checks if an attribute is defined.
*
* @param string $name The attribute name
*
* @return Boolean true if the attribute is defined, false otherwise
*
* @api
*/
public function has($name)
{
return array_key_exists($name, $this->attributes);
}
/**
* Returns an attribute.
*
* @param string $name The attribute name
* @param mixed $default The default value
*
* @return mixed
*
* @api
*/
public function get($name, $default = null)
{
return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
}
/**
* Sets an attribute.
*
* @param string $name
* @param mixed $value
*
* @api
*/
public function set($name, $value)
{
if (false === $this->started) {
$this->start();
}
$this->attributes[$name] = $value;
}
/**
* Returns attributes.
*
* @return array Attributes
*
* @api
*/
public function all()
{
return $this->attributes;
}
/**
* Sets attributes.
*
* @param array $attributes Attributes
*
* @api
*/
public function replace(array $attributes)
{
if (false === $this->started) {
$this->start();
}
$this->attributes = $attributes;
}
/**
* Removes an attribute.
*
* @param string $name
*
* @api
*/
public function remove($name)
{
if (false === $this->started) {
$this->start();
}
if (array_key_exists($name, $this->attributes)) {
unset($this->attributes[$name]);
}
}
/**
* Clears all attributes.
*
* @api
*/
public function clear()
{
if (false === $this->started) {
$this->start();
}
$this->attributes = array();
$this->flashes = array();
}
/**
* Invalidates the current session.
*
* @api
*/
public function invalidate()
{
$this->clear();
$this->storage->regenerate(true);
}
/**
* Migrates the current session to a new session id while maintaining all
* session attributes.
*
* @api
*/
public function migrate()
{
$this->storage->regenerate();
}
/**
* Returns the session ID
*
* @return mixed The session ID
*
* @api
*/
public function getId()
{
if (false === $this->started) {
$this->start();
}
return $this->storage->getId();
}
/**
* Gets the flash messages.
*
* @return array
*/
public function getFlashes()
{
return $this->flashes;
}
/**
* Sets the flash messages.
*
* @param array $values
*/
public function setFlashes($values)
{
if (false === $this->started) {
$this->start();
}
$this->flashes = $values;
$this->oldFlashes = array();
}
/**
* Gets a flash message.
*
* @param string $name
* @param string|null $default
*
* @return string
*/
public function getFlash($name, $default = null)
{
return array_key_exists($name, $this->flashes) ? $this->flashes[$name] : $default;
}
/**
* Sets a flash message.
*
* @param string $name
* @param string $value
*/
public function setFlash($name, $value)
{
if (false === $this->started) {
$this->start();
}
$this->flashes[$name] = $value;
unset($this->oldFlashes[$name]);
}
/**
* Checks whether a flash message exists.
*
* @param string $name
*
* @return Boolean
*/
public function hasFlash($name)
{
if (false === $this->started) {
$this->start();
}
return array_key_exists($name, $this->flashes);
}
/**
* Removes a flash message.
*
* @param string $name
*/
public function removeFlash($name)
{
if (false === $this->started) {
$this->start();
}
unset($this->flashes[$name]);
}
/**
* Removes the flash messages.
*/
public function clearFlashes()
{
if (false === $this->started) {
$this->start();
}
$this->flashes = array();
$this->oldFlashes = array();
}
public function save()
{
if (false === $this->started) {
$this->start();
}
$this->flashes = array_diff_key($this->flashes, $this->oldFlashes);
$this->storage->write('_symfony2', array(
'attributes' => $this->attributes,
'flashes' => $this->flashes,
));
}
/**
* This method should be called when you don't want the session to be saved
* when the Session object is garbaged collected (useful for instance when
* you want to simulate the interaction of several users/sessions in a single
* PHP process).
*/
public function close()
{
$this->closed = true;
}
public function __destruct()
{
if (true === $this->started && !$this->closed) {
$this->save();
}
}
public function serialize()
{
return serialize($this->storage);
}
public function unserialize($serialized)
{
$this->storage = unserialize($serialized);
$this->attributes = array();
$this->started = false;
}
}