Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. MockFileSessionStorage.php

class MockFileSessionStorage

MockFileSessionStorage is used to mock sessions for functional testing where you may need to persist session data across separate PHP processes.

No PHP session is actually started since a session can be initialized and shutdown only once per PHP execution cycle and this class does not pollute any session related globals, including session_*() functions or session.* PHP ini directives.

@author Drak <drak@zikula.org>

Hierarchy

  • class \Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage implements \Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface
    • class \Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage extends \Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage

Expanded class hierarchy of MockFileSessionStorage

File

vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php, line 26

Namespace

Symfony\Component\HttpFoundation\Session\Storage
View source
class MockFileSessionStorage extends MockArraySessionStorage {
    private string $savePath;
    
    /**
     * @param string|null $savePath Path of directory to save session files
     */
    public function __construct(?string $savePath = null, string $name = 'MOCKSESSID', ?MetadataBag $metaBag = null) {
        $savePath ??= sys_get_temp_dir();
        if (!is_dir($savePath) && !@mkdir($savePath, 0777, true) && !is_dir($savePath)) {
            throw new \RuntimeException(\sprintf('Session Storage was not able to create directory "%s".', $savePath));
        }
        $this->savePath = $savePath;
        parent::__construct($name, $metaBag);
    }
    public function start() : bool {
        if ($this->started) {
            return true;
        }
        if (!$this->id) {
            $this->id = $this->generateId();
        }
        $this->read();
        $this->started = true;
        return true;
    }
    public function regenerate(bool $destroy = false, ?int $lifetime = null) : bool {
        if (!$this->started) {
            $this->start();
        }
        if ($destroy) {
            $this->destroy();
        }
        return parent::regenerate($destroy, $lifetime);
    }
    public function save() : void {
        if (!$this->started) {
            throw new \RuntimeException('Trying to save a session that was not started yet or was already closed.');
        }
        $data = $this->data;
        foreach ($this->bags as $bag) {
            if (empty($data[$key = $bag->getStorageKey()])) {
                unset($data[$key]);
            }
        }
        if ([
            $key = $this->metadataBag
                ->getStorageKey(),
        ] === array_keys($data)) {
            unset($data[$key]);
        }
        try {
            if ($data) {
                $path = $this->getFilePath();
                $tmp = $path . bin2hex(random_bytes(6));
                file_put_contents($tmp, serialize($data));
                rename($tmp, $path);
            }
            else {
                $this->destroy();
            }
        } finally {
            $this->data = $data;
        }
        // this is needed when the session object is re-used across multiple requests
        // in functional tests.
        $this->started = false;
    }
    
    /**
     * Deletes a session from persistent storage.
     * Deliberately leaves session data in memory intact.
     */
    private function destroy() : void {
        set_error_handler(static function () {
        });
        try {
            unlink($this->getFilePath());
        } finally {
            restore_error_handler();
        }
    }
    
    /**
     * Calculate path to file.
     */
    private function getFilePath() : string {
        return $this->savePath . '/' . $this->id . '.mocksess';
    }
    
    /**
     * Reads session from storage and loads session.
     */
    private function read() : void {
        set_error_handler(static function () {
        });
        try {
            $data = file_get_contents($this->getFilePath());
        } finally {
            restore_error_handler();
        }
        $this->data = $data ? unserialize($data) : [];
        $this->loadSession();
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
MockArraySessionStorage::$bags protected property
MockArraySessionStorage::$closed protected property
MockArraySessionStorage::$data protected property
MockArraySessionStorage::$id protected property
MockArraySessionStorage::$metadataBag protected property
MockArraySessionStorage::$started protected property
MockArraySessionStorage::clear public function Clear all session data in memory. Overrides SessionStorageInterface::clear
MockArraySessionStorage::generateId protected function Generates a session ID.
MockArraySessionStorage::getBag public function Gets a SessionBagInterface by name. Overrides SessionStorageInterface::getBag
MockArraySessionStorage::getId public function Returns the session ID. Overrides SessionStorageInterface::getId
MockArraySessionStorage::getMetadataBag public function Gets the MetadataBag. Overrides SessionStorageInterface::getMetadataBag
MockArraySessionStorage::getName public function Returns the session name. Overrides SessionStorageInterface::getName
MockArraySessionStorage::isStarted public function Checks if the session is started. Overrides SessionStorageInterface::isStarted
MockArraySessionStorage::loadSession protected function
MockArraySessionStorage::registerBag public function Registers a SessionBagInterface for use. Overrides SessionStorageInterface::registerBag
MockArraySessionStorage::setId public function Sets the session ID. Overrides SessionStorageInterface::setId
MockArraySessionStorage::setMetadataBag public function
MockArraySessionStorage::setName public function Sets the session name. Overrides SessionStorageInterface::setName
MockArraySessionStorage::setSessionData public function
MockFileSessionStorage::$savePath private property
MockFileSessionStorage::destroy private function Deletes a session from persistent storage.
Deliberately leaves session data in memory intact.
MockFileSessionStorage::getFilePath private function Calculate path to file.
MockFileSessionStorage::read private function Reads session from storage and loads session.
MockFileSessionStorage::regenerate public function Regenerates id that represents this storage. Overrides MockArraySessionStorage::regenerate
MockFileSessionStorage::save public function Force the session to be saved and closed. Overrides MockArraySessionStorage::save
MockFileSessionStorage::start public function Starts the session. Overrides MockArraySessionStorage::start
MockFileSessionStorage::__construct public function Overrides MockArraySessionStorage::__construct
RSS feed
Powered by Drupal