Skip to content

Commit ed6f90d

Browse files
committed
ArrayAccessor facades for CLI & HTTP
1 parent 44748b7 commit ed6f90d

File tree

3 files changed

+136
-0
lines changed

3 files changed

+136
-0
lines changed

src/Cli/InputParams.php

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace WonderNetwork\SlimKernel\Cli;
5+
6+
use RuntimeException;
7+
use Symfony\Component\Console\Input\InputInterface;
8+
use WonderNetwork\SlimKernel\Accessor\ArrayAccessor;
9+
10+
/**
11+
* @property ArrayAccessor $arguments
12+
* @property ArrayAccessor $options
13+
*/
14+
final class InputParams {
15+
private ArrayAccessor $arguments;
16+
private ArrayAccessor $options;
17+
18+
public static function ofInput(InputInterface $input): self {
19+
return new self(
20+
ArrayAccessor::of($input->getArguments()),
21+
ArrayAccessor::of($input->getOptions()),
22+
);
23+
}
24+
25+
public function __construct(ArrayAccessor $arguments, ArrayAccessor $options) {
26+
$this->arguments = $arguments;
27+
$this->options = $options;
28+
}
29+
30+
public function __get(string $name): ArrayAccessor {
31+
switch ($name) {
32+
case 'arguments':
33+
return $this->arguments;
34+
case 'options':
35+
return $this->options;
36+
}
37+
throw new RuntimeException("Unknown collection: $name");
38+
}
39+
}

src/Http/RequestParams.php

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace WonderNetwork\SlimKernel\Http;
5+
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use RuntimeException;
8+
use Slim\Exception\HttpBadRequestException;
9+
use Slim\Exception\HttpNotFoundException;
10+
use WonderNetwork\SlimKernel\Accessor\ArrayAccessor;
11+
12+
/**
13+
* @property ArrayAccessor $params
14+
* @property ArrayAccessor $query
15+
* @property ArrayAccessor $server
16+
*/
17+
final class RequestParams {
18+
private ArrayAccessor $params;
19+
private ArrayAccessor $query;
20+
private ArrayAccessor $server;
21+
private ServerRequestInterface $request;
22+
23+
public static function of(ServerRequestInterface $request): self {
24+
return new self($request);
25+
}
26+
27+
public function __construct(ServerRequestInterface $request) {
28+
$this->params = ArrayAccessor::of($request->getParsedBody(), [$this, 'exceptionFactory']);
29+
$this->query = ArrayAccessor::of($request->getQueryParams(), [$this, 'exceptionFactory']);
30+
$this->server = ArrayAccessor::of($request->getServerParams(), [$this, 'exceptionFactory']);
31+
$this->request = $request;
32+
}
33+
34+
public function exceptionFactory(string $message): HttpBadRequestException {
35+
return new HttpBadRequestException($this->request, $message);
36+
}
37+
38+
public function __get(string $name): ArrayAccessor {
39+
switch ($name) {
40+
case 'params':
41+
return $this->params;
42+
case 'query':
43+
return $this->query;
44+
case 'server':
45+
return $this->server;
46+
}
47+
48+
throw new RuntimeException("Unknown collection: $name");
49+
}
50+
51+
/** @return never */
52+
public function notFound(string $message = null): void {
53+
throw new HttpNotFoundException($this->request, $message);
54+
}
55+
56+
/** @return never */
57+
public function badRequest(string $message = null): void {
58+
throw new HttpBadRequestException($this->request, $message);
59+
}
60+
61+
public function request(): ServerRequestInterface {
62+
return $this->request;
63+
}
64+
}

src/Http/RouteArgument.php

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace WonderNetwork\SlimKernel\Http;
5+
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Slim\Exception\HttpBadRequestException;
8+
use Slim\Routing\RouteContext;
9+
10+
final class RouteArgument {
11+
public static function maybe(ServerRequestInterface $request, string $name): string {
12+
return self::find($request, $name) ?? '';
13+
}
14+
15+
public static function find(ServerRequestInterface $request, string $name): ?string {
16+
$route = RouteContext::fromRequest($request)->getRoute();
17+
if (null === $route) {
18+
throw new HttpBadRequestException(
19+
$request,
20+
"Route is not initialized on request while accessing $name",
21+
);
22+
}
23+
return $route->getArgument($name);
24+
}
25+
26+
public static function get(ServerRequestInterface $request, string $name): string {
27+
$value = self::find($request, $name);
28+
if (null === $value) {
29+
throw new HttpBadRequestException($request, "Route argument $name not found");
30+
}
31+
return $value;
32+
}
33+
}

0 commit comments

Comments
 (0)