Skip to content

Commit

Permalink
Added SessionMap to aid in session programming
Browse files Browse the repository at this point in the history
  • Loading branch information
ricardoboss committed Feb 8, 2022
1 parent 235c63b commit 9c9efd0
Show file tree
Hide file tree
Showing 12 changed files with 187 additions and 32 deletions.
2 changes: 2 additions & 0 deletions modules/Collection/src/IsKeyedEnumerable.php
Expand Up @@ -435,6 +435,7 @@ public function lastOrDefault(mixed $default, ?callable $predicate = null): mixe
*/
public function max(callable $selector): int|float|string
{
/** @var Iterator<TIteratorKey, TSource> $iterator */
$iterator = $this->getIterator();
$iterator->rewind();
if (!$iterator->valid()) {
Expand All @@ -460,6 +461,7 @@ public function max(callable $selector): int|float|string
*/
public function min(callable $selector): int|float|string
{
/** @var Iterator<TIteratorKey, TSource> $iterator */
$iterator = $this->getIterator();
$iterator->rewind();
if (!$iterator->valid()) {
Expand Down
5 changes: 4 additions & 1 deletion modules/Core/src/Handler/HandledRequest.php
Expand Up @@ -6,6 +6,7 @@
use Elephox\Http\Contract\CookieMap;
use Elephox\Http\Contract\HeaderMap;
use Elephox\Http\Contract\ParameterMap;
use Elephox\Http\Contract\SessionMap;
use Elephox\Http\Contract\UploadedFileMap;
use Elephox\Http\ServerRequest;
use Elephox\Http\RequestMethod;
Expand All @@ -26,10 +27,11 @@ public function __construct(
Url $url,
ParameterMap $parameters,
CookieMap $cookies,
?SessionMap $session,
UploadedFileMap $uploadedFiles,
public readonly Contract\MatchedUrlTemplate $template
) {
parent::__construct($protocolVersion, $headers, $body, $method, $url, $parameters, $cookies, $uploadedFiles);
parent::__construct($protocolVersion, $headers, $body, $method, $url, $parameters, $cookies, $session, $uploadedFiles);
}

#[Pure]
Expand All @@ -49,6 +51,7 @@ public function with(): Contract\HandledRequestBuilder
$this->url,
$this->parameters,
$this->cookies,
$this->session,
$this->uploadedFiles,
$this->template,
);
Expand Down
11 changes: 7 additions & 4 deletions modules/Core/src/Handler/HandledRequestBuilder.php
Expand Up @@ -32,7 +32,8 @@ public static function fromRequest(Request $request): static
$request->getMethod(),
$request->getUrl(),
$request instanceof ServerRequest ? $request->getParameters() : null,
$request instanceof ServerRequest ? $request->getCookieMap() : null,
$request instanceof ServerRequest ? $request->getCookies() : null,
$request instanceof ServerRequest ? $request->getSession() : null,
$request instanceof ServerRequest ? $request->getUploadedFiles() : null,
$request instanceof Contract\HandledRequest ? $request->getMatchedTemplate() : null,
);
Expand All @@ -46,11 +47,12 @@ public function __construct(
?RequestMethod $method = null,
?Url $url = null,
?HttpContract\ParameterMap $parameters = null,
?HttpContract\CookieMap $cookieMap = null,
?HttpContract\CookieMap $cookies = null,
?HttpContract\SessionMap $session = null,
?HttpContract\UploadedFileMap $uploadedFiles = null,
protected ?Contract\MatchedUrlTemplate $matchedTemplate = null
) {
parent::__construct($protocolVersion, $headers, $body, $method, $url, $parameters, $cookieMap, $uploadedFiles);
parent::__construct($protocolVersion, $headers, $body, $method, $url, $parameters, $cookies, $session, $uploadedFiles);
}

public function matchedTemplate(Contract\MatchedUrlTemplate $matchedUrlTemplate): static
Expand All @@ -69,7 +71,8 @@ public function get(): Contract\HandledRequest
$this->method ?? RequestMethod::GET,
$this->url ?? throw self::missingParameterException("url"),
$this->parameters ?? new ParameterMap(),
$this->cookieMap ?? new CookieMap(),
$this->cookies ?? new CookieMap(),
$this->session,
$this->uploadedFiles ?? new UploadedFileMap(),
$this->matchedTemplate ?? throw self::missingParameterException("template")
);
Expand Down
2 changes: 1 addition & 1 deletion modules/Http/src/Contract/ParameterMap.php
Expand Up @@ -9,7 +9,7 @@

interface ParameterMap extends ArrayAccess
{
public static function fromGlobals(?array $post = null, ?array $get = null, ?array $session = null, ?array $server = null, ?array $env = null): ParameterMap;
public static function fromGlobals(?array $post = null, ?array $get = null, ?array $server = null, ?array $env = null): ParameterMap;

public function get(string $key, ?ParameterSource $source = null): mixed;

Expand Down
5 changes: 4 additions & 1 deletion modules/Http/src/Contract/ServerRequest.php
Expand Up @@ -19,8 +19,11 @@ public function with(): ServerRequestBuilder;
public function getParameters(): ParameterMap;

#[Pure]
public function getCookieMap(): CookieMap;
public function getCookies(): CookieMap;

#[Pure]
public function getUploadedFiles(): UploadedFileMap;

#[Pure]
public function getSession(): ?SessionMap;
}
8 changes: 6 additions & 2 deletions modules/Http/src/Contract/ServerRequestBuilder.php
Expand Up @@ -16,15 +16,19 @@ public static function fromGlobals(): ServerRequest;

public function parameter(string $key, int|string|array $value, ParameterSource $source): static;

public function parameterMap(ParameterMap $parameterMap): static;
public function parameters(ParameterMap $parameters): static;

public function cookie(Cookie $cookie): static;

public function cookieMap(CookieMap $cookieMap): static;
public function cookies(CookieMap $cookies): static;

public function uploadedFile(string $name, UploadedFile $uploadedFile): static;

public function uploadedFiles(UploadedFileMap $uploadedFiles): static;

public function sessionParam(string $name, mixed $value): static;

public function session(SessionMap $session): static;

public function get(): ServerRequest;
}
18 changes: 18 additions & 0 deletions modules/Http/src/Contract/SessionMap.php
@@ -0,0 +1,18 @@
<?php
declare(strict_types=1);

namespace Elephox\Http\Contract;

use Elephox\Collection\Contract\GenericMap;

/**
* @extends GenericMap<array-key, mixed>
*/
interface SessionMap extends GenericMap
{
/**
* @param null|array $session
* @return null|SessionMap
*/
public static function fromGlobals(?array $session = null, bool $recreate = false): ?SessionMap;
}
10 changes: 1 addition & 9 deletions modules/Http/src/ParameterMap.php
Expand Up @@ -95,11 +95,10 @@ public function all(?ParameterSource $source = null): GenericEnumerable
return new Enumerable($iterator);
}

public static function fromGlobals(?array $post = null, ?array $get = null, ?array $session = null, ?array $server = null, ?array $env = null): Contract\ParameterMap
public static function fromGlobals(?array $post = null, ?array $get = null, ?array $server = null, ?array $env = null): Contract\ParameterMap
{
$post ??= $_POST;
$get ??= $_GET;
$session ??= $_SESSION ?? [];
$server ??= $_SERVER;
$env ??= $_ENV;

Expand Down Expand Up @@ -161,13 +160,6 @@ public static function fromGlobals(?array $post = null, ?array $get = null, ?arr
$map->put($name, ParameterSource::Post, $value);
}

/**
* @var mixed $value
*/
foreach ($session as $name => $value) {
$map->put($name, ParameterSource::Session, $value);
}

/**
* @var mixed $value
*/
Expand Down
1 change: 0 additions & 1 deletion modules/Http/src/ParameterSource.php
Expand Up @@ -10,7 +10,6 @@ enum ParameterSource
{
case Post;
case Get;
case Session;
case Server;
case Env;
}
13 changes: 11 additions & 2 deletions modules/Http/src/ServerRequest.php
Expand Up @@ -6,6 +6,7 @@
use Elephox\Http\Contract\CookieMap;
use Elephox\Http\Contract\HeaderMap;
use Elephox\Http\Contract\ParameterMap;
use Elephox\Http\Contract\SessionMap;
use Elephox\Http\Contract\UploadedFileMap;
use Elephox\Stream\Contract\Stream;
use JetBrains\PhpStorm\Immutable;
Expand All @@ -29,6 +30,7 @@ public function __construct(
Url $url,
public readonly ParameterMap $parameters,
public readonly CookieMap $cookies,
public readonly ?SessionMap $session,
public readonly UploadedFileMap $uploadedFiles
) {
parent::__construct($protocolVersion, $headers, $body, $method, $url);
Expand All @@ -45,7 +47,8 @@ public function with(): Contract\ServerRequestBuilder
$this->url,
$this->parameters,
$this->cookies,
$this->uploadedFiles
$this->session,
$this->uploadedFiles,
);
}

Expand All @@ -56,7 +59,7 @@ public function getParameters(): ParameterMap
}

#[Pure]
public function getCookieMap(): CookieMap
public function getCookies(): CookieMap
{
return $this->cookies;
}
Expand All @@ -66,4 +69,10 @@ public function getUploadedFiles(): UploadedFileMap
{
return $this->uploadedFiles;
}

#[Pure]
public function getSession(): ?SessionMap
{
return $this->session;
}
}
45 changes: 34 additions & 11 deletions modules/Http/src/ServerRequestBuilder.php
Expand Up @@ -25,7 +25,8 @@ public function __construct(
?RequestMethod $method = null,
?Url $url = null,
protected ?Contract\ParameterMap $parameters = null,
protected ?Contract\CookieMap $cookieMap = null,
protected ?Contract\CookieMap $cookies = null,
protected ?Contract\SessionMap $session = null,
protected ?Contract\UploadedFileMap $uploadedFiles = null
) {
parent::__construct($protocolVersion, $headers, $body, $method, $url);
Expand All @@ -42,27 +43,45 @@ public function parameter(string $key, array|int|string $value, ParameterSource
return $this;
}

public function parameterMap(Contract\ParameterMap $parameterMap): static
public function parameters(Contract\ParameterMap $parameters): static
{
$this->parameters = $parameterMap;
$this->parameters = $parameters;

return $this;
}

public function cookie(Cookie $cookie): static
{
if ($this->cookieMap === null) {
$this->cookieMap = new CookieMap();
if ($this->cookies === null) {
$this->cookies = new CookieMap();
}

$this->cookieMap->put($cookie->getName(), $cookie);
$this->cookies->put($cookie->getName(), $cookie);

return $this;
}

public function cookieMap(Contract\CookieMap $cookieMap): static
public function cookies(Contract\CookieMap $cookies): static
{
$this->cookieMap = $cookieMap;
$this->cookies = $cookies;

return $this;
}

public function sessionParam(string $name, mixed $value): static
{
if ($this->session === null) {
$this->session = SessionMap::start([]);
}

$this->session->put($name, $value);

return $this;
}

public function session(?Contract\SessionMap $session): static
{
$this->session = $session;

return $this;
}
Expand Down Expand Up @@ -94,7 +113,8 @@ public function get(): Contract\ServerRequest
$this->method ?? RequestMethod::GET,
$this->url ?? throw self::missingParameterException("url"),
$this->parameters ?? new ParameterMap(),
$this->cookieMap ?? new CookieMap(),
$this->cookies ?? new CookieMap(),
$this->session,
$this->uploadedFiles ?? new UploadedFileMap()
);
}
Expand All @@ -103,6 +123,7 @@ public static function fromGlobals(
?Contract\ParameterMap $parameters = null,
?Contract\HeaderMap $headers = null,
?Contract\CookieMap $cookies = null,
?Contract\SessionMap $session = null,
?Contract\UploadedFileMap $files = null,
?string $protocolVersion = AbstractMessageBuilder::DefaultProtocolVersion,
?Stream $body = null,
Expand All @@ -113,12 +134,14 @@ public static function fromGlobals(
$parameters ??= ParameterMap::fromGlobals();
$headers ??= HeaderMap::fromGlobals();
$cookies ??= CookieMap::fromGlobals();
$session ??= SessionMap::fromGlobals();
$files ??= UploadedFileMap::fromGlobals();

$builder = new self();
$builder->parameterMap($parameters);
$builder->parameters($parameters);
$builder->headerMap($headers);
$builder->cookieMap($cookies);
$builder->cookies($cookies);
$builder->session($session);
$builder->uploadedFiles($files);

if ($body === null) {
Expand Down

0 comments on commit 9c9efd0

Please sign in to comment.