rosavox/lib/alveolata/session/implementation-cgi.php
2025-05-23 07:33:29 +00:00

195 lines
3.5 KiB
PHP

<?php
namespace alveolata\session;
// require_once(DIR_ALVEOLATA . '/definitions.php');
require_once(DIR_ALVEOLATA . '/session/interface.php');
/**
* @author Christian Fraß <frass@greenscale.de>
*/
class struct_subject_cgi {
/**
* @var string
* @author Christian Fraß <frass@greenscale.de>
*/
public $id;
/**
* @param string $id
* @author Christian Fraß <frass@greenscale.de>
*/
public function __construct(
string $id
)
{
$this->id = $id;
}
}
/**
* @param struct_subject_cgi $subject
* @param string $key
* @throw \Exception if no such key
* @author Christian Fraß <frass@greenscale.de>
*/
function _cgi_keycheck(
struct_subject_cgi $subject,
string $key
) : void
{
// \session_id($subject->id);
if (! array_key_exists($key, $_SESSION)) {
$message = sprintf('no key "%s"', $key);
throw (new \Exception($message));
}
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_set_dir(
string $path
) : void
{
ini_set('session.save_path', $path);
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_begin(
) : struct_subject_cgi
{
\session_start();
$id = \session_id();
$subject = new struct_subject_cgi($id);
return $subject;
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_get(
string $id
) : struct_subject_cgi
{
$subject = (new struct_subject_cgi($id));
\session_id($id);
\session_start();
return $subject;
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_id(
struct_subject_cgi $subject
) : string
{
return $subject->id;
}
/**
* @implementation
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_read(
struct_subject_cgi $subject,
string $key
) : string
{
_cgi_keycheck($subject, $key);
// \session_id($subject->id);
$value = $_SESSION[$key];
return $value;
}
/**
* @implementation
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_write(
struct_subject_cgi $subject,
string $key,
string $value
) : void
{
// \session_id($subject->id);
$_SESSION[$key] = $value;
}
/**
* @implementation
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_remove(
struct_subject_cgi $subject,
string $key
) : void
{
_cgi_keycheck($subject, $key);
// \session_id($subject->id);
unset($_SESSION[$key]);
}
/**
* @implementation
* @author Christian Fraß <frass@greenscale.de>
*/
function cgi_end(
struct_subject_cgi $subject
) : void
{
// \session_id($subject->id);
\session_destroy();
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
class implementation_cgi implements interface_session {
/**
* @var struct_subject_cgi
* @author Christian Fraß <frass@greenscale.de>
*/
private $subject;
/**
* @author Christian Fraß <frass@greenscale.de>
*/
private function __construct(struct_subject_cgi $subject) {$this->subject = $subject;}
/**
* implementations
*
* @author Christian Fraß <frass@greenscale.de>
*/
public static function begin() : interface_session {return (new implementation_cgi(cgi_begin()));}
public static function get(string $id) : interface_session {return (new implementation_cgi(cgi_get($id)));}
public function id() : string {return cgi_id($this->subject);}
public function read(string $key) : string {return cgi_read($this->subject, $key);}
public function write(string $key, string $value) : void {cgi_write($this->subject, $key, $value);}
public function remove(string $key) : void {cgi_remove($this->subject, $key);}
public function end() : void {cgi_end($this->subject);}
}
?>