Вход Регистрация
Файл: vendor/symfony/http-foundation/Session/Session.php
Строк: 233
<?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 SymfonyComponentHttpFoundationSession;

use 
SymfonyComponentHttpFoundationSessionAttributeAttributeBag;
use 
SymfonyComponentHttpFoundationSessionAttributeAttributeBagInterface;
use 
SymfonyComponentHttpFoundationSessionFlashFlashBag;
use 
SymfonyComponentHttpFoundationSessionFlashFlashBagInterface;
use 
SymfonyComponentHttpFoundationSessionStorageMetadataBag;
use 
SymfonyComponentHttpFoundationSessionStorageNativeSessionStorage;
use 
SymfonyComponentHttpFoundationSessionStorageSessionStorageInterface;

// Help opcache.preload discover always-needed symbols
class_exists(AttributeBag::class);
class_exists(FlashBag::class);
class_exists(SessionBagProxy::class);

/**
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Drak <drak@zikula.org>
 *
 * @implements IteratorAggregate<string, mixed>
 */
class Session implements FlashBagAwareSessionInterfaceIteratorAggregateCountable
{
    protected 
$storage;

    private 
string $flashName;
    private 
string $attributeName;
    private array 
$data = [];
    private 
int $usageIndex 0;
    private ?
Closure $usageReporter;

    public function 
__construct(?SessionStorageInterface $storage null, ?AttributeBagInterface $attributes null, ?FlashBagInterface $flashes null, ?callable $usageReporter null)
    {
        
$this->storage $storage ?? new NativeSessionStorage();
        
$this->usageReporter null === $usageReporter null $usageReporter(...);

        
$attributes ??= new AttributeBag();
        
$this->attributeName $attributes->getName();
        
$this->registerBag($attributes);

        
$flashes ??= new FlashBag();
        
$this->flashName $flashes->getName();
        
$this->registerBag($flashes);
    }

    public function 
start(): bool
    
{
        return 
$this->storage->start();
    }

    public function 
has(string $name): bool
    
{
        return 
$this->getAttributeBag()->has($name);
    }

    public function 
get(string $namemixed $default null): mixed
    
{
        return 
$this->getAttributeBag()->get($name$default);
    }

    
/**
     * @return void
     */
    
public function set(string $namemixed $value)
    {
        
$this->getAttributeBag()->set($name$value);
    }

    public function 
all(): array
    {
        return 
$this->getAttributeBag()->all();
    }

    
/**
     * @return void
     */
    
public function replace(array $attributes)
    {
        
$this->getAttributeBag()->replace($attributes);
    }

    public function 
remove(string $name): mixed
    
{
        return 
$this->getAttributeBag()->remove($name);
    }

    
/**
     * @return void
     */
    
public function clear()
    {
        
$this->getAttributeBag()->clear();
    }

    public function 
isStarted(): bool
    
{
        return 
$this->storage->isStarted();
    }

    
/**
     * Returns an iterator for attributes.
     *
     * @return ArrayIterator<string, mixed>
     */
    
public function getIterator(): ArrayIterator
    
{
        return new 
ArrayIterator($this->getAttributeBag()->all());
    }

    
/**
     * Returns the number of attributes.
     */
    
public function count(): int
    
{
        return 
count($this->getAttributeBag()->all());
    }

    public function &
getUsageIndex(): int
    
{
        return 
$this->usageIndex;
    }

    
/**
     * @internal
     */
    
public function isEmpty(): bool
    
{
        if (
$this->isStarted()) {
            ++
$this->usageIndex;
            if (
$this->usageReporter && <= $this->usageIndex) {
                (
$this->usageReporter)();
            }
        }
        foreach (
$this->data as &$data) {
            if (!empty(
$data)) {
                return 
false;
            }
        }

        return 
true;
    }

    public function 
invalidate(?int $lifetime null): bool
    
{
        
$this->storage->clear();

        return 
$this->migrate(true$lifetime);
    }

    public function 
migrate(bool $destroy false, ?int $lifetime null): bool
    
{
        return 
$this->storage->regenerate($destroy$lifetime);
    }

    
/**
     * @return void
     */
    
public function save()
    {
        
$this->storage->save();
    }

    public function 
getId(): string
    
{
        return 
$this->storage->getId();
    }

    
/**
     * @return void
     */
    
public function setId(string $id)
    {
        if (
$this->storage->getId() !== $id) {
            
$this->storage->setId($id);
        }
    }

    public function 
getName(): string
    
{
        return 
$this->storage->getName();
    }

    
/**
     * @return void
     */
    
public function setName(string $name)
    {
        
$this->storage->setName($name);
    }

    public function 
getMetadataBag(): MetadataBag
    
{
        ++
$this->usageIndex;
        if (
$this->usageReporter && <= $this->usageIndex) {
            (
$this->usageReporter)();
        }

        return 
$this->storage->getMetadataBag();
    }

    
/**
     * @return void
     */
    
public function registerBag(SessionBagInterface $bag)
    {
        
$this->storage->registerBag(new SessionBagProxy($bag$this->data$this->usageIndex$this->usageReporter));
    }

    public function 
getBag(string $name): SessionBagInterface
    
{
        
$bag $this->storage->getBag($name);

        return 
method_exists($bag'getBag') ? $bag->getBag() : $bag;
    }

    
/**
     * Gets the flashbag interface.
     */
    
public function getFlashBag(): FlashBagInterface
    
{
        return 
$this->getBag($this->flashName);
    }

    
/**
     * Gets the attributebag interface.
     *
     * Note that this method was added to help with IDE autocompletion.
     */
    
private function getAttributeBag(): AttributeBagInterface
    
{
        return 
$this->getBag($this->attributeName);
    }
}
Онлайн: 0
Реклама