You are here

MockFileSessionStorage.php in Zircon Profile 8.0

File

vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
View source
<?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\Session\Storage;


/**
 * MockFileSessionStorage is used to mock sessions for
 * functional testing when done in a single PHP process.
 *
 * 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>
 */
class MockFileSessionStorage extends MockArraySessionStorage {

  /**
   * @var string
   */
  private $savePath;

  /**
   * Constructor.
   *
   * @param string      $savePath Path of directory to save session files.
   * @param string      $name     Session name.
   * @param MetadataBag $metaBag  MetadataBag instance.
   */
  public function __construct($savePath = null, $name = 'MOCKSESSID', MetadataBag $metaBag = null) {
    if (null === $savePath) {
      $savePath = sys_get_temp_dir();
    }
    if (!is_dir($savePath)) {
      mkdir($savePath, 0777, true);
    }
    $this->savePath = $savePath;
    parent::__construct($name, $metaBag);
  }

  /**
   * {@inheritdoc}
   */
  public function start() {
    if ($this->started) {
      return true;
    }
    if (!$this->id) {
      $this->id = $this
        ->generateId();
    }
    $this
      ->read();
    $this->started = true;
    return true;
  }

  /**
   * {@inheritdoc}
   */
  public function regenerate($destroy = false, $lifetime = null) {
    if (!$this->started) {
      $this
        ->start();
    }
    if ($destroy) {
      $this
        ->destroy();
    }
    return parent::regenerate($destroy, $lifetime);
  }

  /**
   * {@inheritdoc}
   */
  public function save() {
    if (!$this->started) {
      throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
    }
    file_put_contents($this
      ->getFilePath(), serialize($this->data));

    // this is needed for Silex, where the session object is re-used across requests
    // in functional tests. In Symfony, the container is rebooted, so we don't have
    // this issue
    $this->started = false;
  }

  /**
   * Deletes a session from persistent storage.
   * Deliberately leaves session data in memory intact.
   */
  private function destroy() {
    if (is_file($this
      ->getFilePath())) {
      unlink($this
        ->getFilePath());
    }
  }

  /**
   * Calculate path to file.
   *
   * @return string File path
   */
  private function getFilePath() {
    return $this->savePath . '/' . $this->id . '.mocksess';
  }

  /**
   * Reads session from storage and loads session.
   */
  private function read() {
    $filePath = $this
      ->getFilePath();
    $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : array();
    $this
      ->loadSession();
  }

}

Classes

Namesort descending Description
MockFileSessionStorage MockFileSessionStorage is used to mock sessions for functional testing when done in a single PHP process.