-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathTools.php
More file actions
128 lines (104 loc) · 3.13 KB
/
Tools.php
File metadata and controls
128 lines (104 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php declare(strict_types=1);
namespace Parable\Framework\Http;
use Parable\Framework\FrameworkException;
use Parable\GetSet\GetCollection;
use Parable\GetSet\ServerCollection;
use Parable\Http\HeaderSender;
use Parable\Http\Request;
use Parable\Routing\Route;
use Parable\Routing\Router;
class Tools
{
public function __construct(
protected GetCollection $get,
protected ServerCollection $server,
protected Request $request,
protected Router $router
) {}
public function getBaseUrl(): string
{
$baseUri = $this->request->getUri()
->withFragment(null)
->withQuery(null);
return $this->replaceAndClean(
$this->getCurrentRelativeUrl(),
'/',
$baseUri->getUriString()
);
}
public function getCurrentRelativeUrl(): string
{
if ($this->isCliServer()) {
$this->get->set('PARABLE_REDIRECT_URL', $this->server->get('PATH_INFO') ?? '');
}
if ($this->get->get('PARABLE_REDIRECT_URL') === null) {
return '/';
}
return $this->clean((string)$this->get->get('PARABLE_REDIRECT_URL'));
}
public function getCurrentUrl(): string
{
return $this->request->getUri()->getUriString();
}
public function buildUrl(string $path): string
{
return sprintf(
'%s/%s',
rtrim($this->getBaseUrl(), '/'),
trim($path, '/')
);
}
public function redirect(string $target): void
{
HeaderSender::send(sprintf('location: %s', $target));
$this->terminate(0);
}
public function redirectToSelf(): void
{
$this->redirect($this->getCurrentUrl());
}
public function redirectToRoute(Route $route, array $parameters = []): void
{
$this->redirect($this->buildUrlFromRoute($route, $parameters));
}
public function buildUrlFromRouteName(string $routeName, array $parameters = []): string
{
$route = $this->router->getRouteByName($routeName);
if ($route === null) {
throw new FrameworkException(sprintf("Could not find route named '%s'", $routeName));
}
return $this->buildUrlFromRoute($route, $parameters);
}
public function buildUrlFromRoute(Route $route, array $parameters = []): string
{
$url = $route->getUrl();
foreach ($parameters as $param => $value) {
$url = $this->replaceAndClean(
sprintf('{%s}', $param),
$value,
$url
);
}
return $this->buildUrl($url);
}
public function terminate(int $exitCode): void
{
exit($exitCode); // @codeCoverageIgnore
}
protected function isCliServer(): bool
{
return PHP_SAPI === 'cli-server';
}
protected function replaceAndClean(string $search, string $replace, string $string): string
{
return $this->clean(str_replace(
$search,
$replace,
$string
));
}
protected function clean(string $string): string
{
return trim($string, '/');
}
}