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

use 
SymfonyComponentHttpFoundationSessionSessionBagInterface;

/**
 * MockArraySessionStorage mocks the session for unit tests.
 *
 * No PHP session is actually started since a session can be initialized
 * and shutdown only once per PHP execution cycle.
 *
 * When doing functional testing, you should use MockFileSessionStorage instead.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 * @author Drak <drak@zikula.org>
 */
class MockArraySessionStorage implements SessionStorageInterface
{
    
/**
     * @var string
     */
    
protected $id '';

    
/**
     * @var string
     */
    
protected $name;

    
/**
     * @var bool
     */
    
protected $started false;

    
/**
     * @var bool
     */
    
protected $closed false;

    
/**
     * @var array
     */
    
protected $data = [];

    
/**
     * @var MetadataBag
     */
    
protected $metadataBag;

    
/**
     * @var array|SessionBagInterface[]
     */
    
protected $bags = [];

    public function 
__construct(string $name 'MOCKSESSID', ?MetadataBag $metaBag null)
    {
        
$this->name $name;
        
$this->setMetadataBag($metaBag);
    }

    
/**
     * @return void
     */
    
public function setSessionData(array $array)
    {
        
$this->data $array;
    }

    public function 
start(): bool
    
{
        if (
$this->started) {
            return 
true;
        }

        if (empty(
$this->id)) {
            
$this->id $this->generateId();
        }

        
$this->loadSession();

        return 
true;
    }

    public function 
regenerate(bool $destroy false, ?int $lifetime null): bool
    
{
        if (!
$this->started) {
            
$this->start();
        }

        
$this->metadataBag->stampNew($lifetime);
        
$this->id $this->generateId();

        return 
true;
    }

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

    
/**
     * @return void
     */
    
public function setId(string $id)
    {
        if (
$this->started) {
            throw new 
LogicException('Cannot set session ID after the session has started.');
        }

        
$this->id $id;
    }

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

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

    
/**
     * @return void
     */
    
public function save()
    {
        if (!
$this->started || $this->closed) {
            throw new 
RuntimeException('Trying to save a session that was not started yet or was already closed.');
        }
        
// nothing to do since we don't persist the session data
        
$this->closed false;
        
$this->started false;
    }

    
/**
     * @return void
     */
    
public function clear()
    {
        
// clear out the bags
        
foreach ($this->bags as $bag) {
            
$bag->clear();
        }

        
// clear out the session
        
$this->data = [];

        
// reconnect the bags to the session
        
$this->loadSession();
    }

    
/**
     * @return void
     */
    
public function registerBag(SessionBagInterface $bag)
    {
        
$this->bags[$bag->getName()] = $bag;
    }

    public function 
getBag(string $name): SessionBagInterface
    
{
        if (!isset(
$this->bags[$name])) {
            throw new 
InvalidArgumentException(sprintf('The SessionBagInterface "%s" is not registered.'$name));
        }

        if (!
$this->started) {
            
$this->start();
        }

        return 
$this->bags[$name];
    }

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

    
/**
     * @return void
     */
    
public function setMetadataBag(?MetadataBag $bag null)
    {
        if (
func_num_args()) {
            
trigger_deprecation('symfony/http-foundation''6.2''Calling "%s()" without any arguments is deprecated, pass null explicitly instead.'__METHOD__);
        }
        
$this->metadataBag $bag ?? new MetadataBag();
    }

    
/**
     * Gets the MetadataBag.
     */
    
public function getMetadataBag(): MetadataBag
    
{
        return 
$this->metadataBag;
    }

    
/**
     * Generates a session ID.
     *
     * This doesn't need to be particularly cryptographically secure since this is just
     * a mock.
     */
    
protected function generateId(): string
    
{
        return 
bin2hex(random_bytes(16));
    }

    
/**
     * @return void
     */
    
protected function loadSession()
    {
        
$bags array_merge($this->bags, [$this->metadataBag]);

        foreach (
$bags as $bag) {
            
$key $bag->getStorageKey();
            
$this->data[$key] ??= [];
            
$bag->initialize($this->data[$key]);
        }

        
$this->started true;
        
$this->closed false;
    }
}
Онлайн: 1
Реклама