Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\HttpFoundation\Session; Chris@0: Chris@0: use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; Chris@0: use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface; Chris@0: use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; Chris@0: use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; Chris@0: use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; Chris@17: use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface; Chris@0: Chris@0: /** Chris@0: * @author Fabien Potencier Chris@0: * @author Drak Chris@0: */ Chris@0: class Session implements SessionInterface, \IteratorAggregate, \Countable Chris@0: { Chris@0: protected $storage; Chris@0: Chris@0: private $flashName; Chris@14: private $attributeName; Chris@17: private $data = []; Chris@16: private $usageIndex = 0; Chris@0: Chris@0: /** Chris@0: * @param SessionStorageInterface $storage A SessionStorageInterface instance Chris@0: * @param AttributeBagInterface $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag) Chris@0: * @param FlashBagInterface $flashes A FlashBagInterface instance (defaults null for default FlashBag) Chris@0: */ Chris@0: public function __construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null) Chris@0: { Chris@0: $this->storage = $storage ?: new NativeSessionStorage(); Chris@0: Chris@0: $attributes = $attributes ?: new AttributeBag(); Chris@0: $this->attributeName = $attributes->getName(); Chris@0: $this->registerBag($attributes); Chris@0: Chris@0: $flashes = $flashes ?: new FlashBag(); Chris@0: $this->flashName = $flashes->getName(); Chris@0: $this->registerBag($flashes); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function start() Chris@0: { Chris@0: return $this->storage->start(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function has($name) Chris@0: { Chris@14: return $this->getAttributeBag()->has($name); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function get($name, $default = null) Chris@0: { Chris@14: return $this->getAttributeBag()->get($name, $default); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function set($name, $value) Chris@0: { Chris@14: $this->getAttributeBag()->set($name, $value); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function all() Chris@0: { Chris@14: return $this->getAttributeBag()->all(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function replace(array $attributes) Chris@0: { Chris@14: $this->getAttributeBag()->replace($attributes); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function remove($name) Chris@0: { Chris@14: return $this->getAttributeBag()->remove($name); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function clear() Chris@0: { Chris@14: $this->getAttributeBag()->clear(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function isStarted() Chris@0: { Chris@0: return $this->storage->isStarted(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns an iterator for attributes. Chris@0: * Chris@0: * @return \ArrayIterator An \ArrayIterator instance Chris@0: */ Chris@0: public function getIterator() Chris@0: { Chris@14: return new \ArrayIterator($this->getAttributeBag()->all()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the number of attributes. Chris@0: * Chris@0: * @return int The number of attributes Chris@0: */ Chris@0: public function count() Chris@0: { Chris@17: return \count($this->getAttributeBag()->all()); Chris@14: } Chris@14: Chris@14: /** Chris@16: * @return int Chris@14: * Chris@14: * @internal Chris@14: */ Chris@16: public function getUsageIndex() Chris@14: { Chris@16: return $this->usageIndex; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return bool Chris@14: * Chris@14: * @internal Chris@14: */ Chris@14: public function isEmpty() Chris@14: { Chris@17: if ($this->isStarted()) { Chris@17: ++$this->usageIndex; Chris@17: } Chris@14: foreach ($this->data as &$data) { Chris@14: if (!empty($data)) { Chris@14: return false; Chris@14: } Chris@14: } Chris@14: Chris@14: return true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function invalidate($lifetime = null) Chris@0: { Chris@0: $this->storage->clear(); Chris@0: Chris@0: return $this->migrate(true, $lifetime); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function migrate($destroy = false, $lifetime = null) Chris@0: { Chris@0: return $this->storage->regenerate($destroy, $lifetime); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function save() Chris@0: { Chris@0: $this->storage->save(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getId() Chris@0: { Chris@0: return $this->storage->getId(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setId($id) Chris@0: { Chris@17: if ($this->storage->getId() !== $id) { Chris@17: $this->storage->setId($id); Chris@17: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getName() Chris@0: { Chris@0: return $this->storage->getName(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setName($name) Chris@0: { Chris@0: $this->storage->setName($name); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getMetadataBag() Chris@0: { Chris@16: ++$this->usageIndex; Chris@16: Chris@0: return $this->storage->getMetadataBag(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function registerBag(SessionBagInterface $bag) Chris@0: { Chris@16: $this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->usageIndex)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getBag($name) Chris@0: { Chris@14: return $this->storage->getBag($name)->getBag(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the flashbag interface. Chris@0: * Chris@0: * @return FlashBagInterface Chris@0: */ Chris@0: public function getFlashBag() Chris@0: { Chris@0: return $this->getBag($this->flashName); Chris@0: } Chris@14: Chris@14: /** Chris@14: * Gets the attributebag interface. Chris@14: * Chris@14: * Note that this method was added to help with IDE autocompletion. Chris@14: * Chris@14: * @return AttributeBagInterface Chris@14: */ Chris@14: private function getAttributeBag() Chris@14: { Chris@14: return $this->getBag($this->attributeName); Chris@14: } Chris@0: }