Skip to content

Commit 389a549

Browse files
committed
Move DI functionality to Settings object
This is actually a Service Locator, but the term 'settings' fits better with pre-existing FastRoute language.
1 parent fcc6278 commit 389a549

File tree

11 files changed

+287
-153
lines changed

11 files changed

+287
-153
lines changed

src/Dispatcher.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
use FastRoute\Dispatcher\Result\MethodNotAllowed;
88
use FastRoute\Dispatcher\Result\NotMatched;
99

10+
/** @phpstan-import-type ParsedRoutes from RouteParser */
1011
interface Dispatcher
1112
{
1213
public const NOT_FOUND = 0;
1314
public const FOUND = 1;
1415
public const METHOD_NOT_ALLOWED = 2;
1516

17+
/** @param ParsedRoutes $processedData */
1618
public function with(array $processedData): self;
1719

1820
/**

src/Dispatcher/RegexBasedAbstract.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public function with(array $data): self
3232
$clone = clone $this;
3333
$clone->staticRouteMap = $data[0];
3434
$clone->variableRouteData = $data[1];
35+
3536
return $clone;
3637
}
3738

src/FastRoute.php

Lines changed: 13 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
namespace FastRoute;
55

66
use Closure;
7-
use FastRoute\Cache\FileCache;
87

98
use function assert;
109
use function is_string;
@@ -16,123 +15,16 @@ final class FastRoute
1615
private ?array $processedConfiguration = null;
1716

1817
/**
19-
* @param Closure(ConfigureRoutes):void $routeDefinitionCallback
20-
* @param class-string<DataGenerator> $dataGenerator
21-
* @param class-string<Dispatcher> $dispatcher
22-
* @param class-string<ConfigureRoutes> $routesConfiguration
23-
* @param class-string<GenerateUri> $uriGenerator
24-
* @param Cache|class-string<Cache>|null $cacheDriver
25-
* @param non-empty-string|null $cacheKey
18+
* @param Closure(ConfigureRoutes):void $routeDefinitionCallback
19+
* @param non-empty-string|null $cacheKey
2620
*/
2721
public function __construct(
2822
private Closure $routeDefinitionCallback,
29-
private DataGenerator $dataGenerator,
30-
private Dispatcher $dispatcher,
31-
private ConfigureRoutes $routesConfiguration,
32-
private GenerateUri $uriGenerator,
33-
private ?Cache $cacheDriver,
3423
private ?string $cacheKey,
24+
private Settings $settings = new FastSettings(),
3525
) {
3626
}
3727

38-
/**
39-
* @param Closure(ConfigureRoutes):void $routeDefinitionCallback
40-
* @param non-empty-string $cacheKey
41-
*/
42-
public static function recommendedSettings(Closure $routeDefinitionCallback, string $cacheKey): self
43-
{
44-
return new self(
45-
$routeDefinitionCallback,
46-
new DataGenerator\MarkBased(),
47-
new Dispatcher\MarkBased(),
48-
new RouteCollector(new RouteParser\Std()),
49-
new GenerateUri\FromProcessedConfiguration,
50-
new FileCache(),
51-
$cacheKey,
52-
);
53-
}
54-
55-
public function disableCache(): self
56-
{
57-
return new self(
58-
$this->routeDefinitionCallback,
59-
$this->dataGenerator,
60-
$this->dispatcher,
61-
$this->routesConfiguration,
62-
$this->uriGenerator,
63-
null,
64-
null,
65-
);
66-
}
67-
68-
/**
69-
* @param Cache|class-string<Cache> $driver
70-
* @param non-empty-string $cacheKey
71-
*/
72-
public function withCache(Cache $driver, string $cacheKey): self
73-
{
74-
return new self(
75-
$this->routeDefinitionCallback,
76-
$this->dataGenerator,
77-
$this->dispatcher,
78-
$this->routesConfiguration,
79-
$this->uriGenerator,
80-
$driver,
81-
$cacheKey,
82-
);
83-
}
84-
85-
public function useCharCountDispatcher(): self
86-
{
87-
return $this->useCustomDispatcher(new DataGenerator\CharCountBased(), new Dispatcher\CharCountBased());
88-
}
89-
90-
public function useGroupCountDispatcher(): self
91-
{
92-
return $this->useCustomDispatcher(new DataGenerator\GroupCountBased(), new Dispatcher\GroupCountBased());
93-
}
94-
95-
public function useGroupPosDispatcher(): self
96-
{
97-
return $this->useCustomDispatcher(new DataGenerator\GroupPosBased(), new Dispatcher\GroupPosBased());
98-
}
99-
100-
public function useMarkDispatcher(): self
101-
{
102-
return $this->useCustomDispatcher(new DataGenerator\MarkBased(), new Dispatcher\MarkBased());
103-
}
104-
105-
/**
106-
* @param class-string<DataGenerator> $dataGenerator
107-
* @param class-string<Dispatcher> $dispatcher
108-
*/
109-
public function useCustomDispatcher(DataGenerator $dataGenerator, Dispatcher $dispatcher): self
110-
{
111-
return new self(
112-
$this->routeDefinitionCallback,
113-
$dataGenerator,
114-
$dispatcher,
115-
$this->routesConfiguration,
116-
$this->uriGenerator,
117-
$this->cacheDriver,
118-
$this->cacheKey,
119-
);
120-
}
121-
122-
/** @param class-string<GenerateUri> $uriGenerator */
123-
public function withUriGenerator(GenerateUri $uriGenerator): self
124-
{
125-
return new self(
126-
$this->routeDefinitionCallback,
127-
$this->dataGenerator,
128-
$this->dispatcher,
129-
$this->routesConfiguration,
130-
$uriGenerator,
131-
$this->cacheDriver,
132-
$this->cacheKey,
133-
);
134-
}
135-
13628
/** @return ProcessedData */
13729
private function buildConfiguration(): array
13830
{
@@ -141,26 +33,30 @@ private function buildConfiguration(): array
14133
}
14234

14335
$loader = function (): array {
144-
($this->routeDefinitionCallback)($this->routesConfiguration);
145-
return $this->routesConfiguration->processedRoutes($this->dataGenerator);
36+
$routesConfiguration = $this->settings->getRoutesConfiguration();
37+
($this->routeDefinitionCallback)($routesConfiguration);
38+
39+
return $routesConfiguration->processedRoutes($this->settings->getDataGenerator());
14640
};
14741

148-
if ($this->cacheDriver === null) {
42+
$cacheDriver = $this->settings->getCacheDriver();
43+
44+
if ($cacheDriver === null) {
14945
return $this->processedConfiguration = $loader();
15046
}
15147

15248
assert(is_string($this->cacheKey));
15349

154-
return $this->processedConfiguration = $this->cacheDriver->get($this->cacheKey, $loader);
50+
return $this->processedConfiguration = $cacheDriver->get($this->cacheKey, $loader);
15551
}
15652

15753
public function dispatcher(): Dispatcher
15854
{
159-
return $this->dispatcher->with($this->buildConfiguration());
55+
return $this->settings->getDispatcher()->with($this->buildConfiguration());
16056
}
16157

16258
public function uriGenerator(): GenerateUri
16359
{
164-
return $this->uriGenerator->with($this->buildConfiguration()[2]);
60+
return $this->settings->getUriGenerator()->with($this->buildConfiguration()[2]);
16561
}
16662
}

src/FastSettings.php

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace FastRoute;
5+
6+
use FastRoute\Cache\FileCache;
7+
8+
use function is_string;
9+
10+
/** @phpstan-import-type ProcessedData from ConfigureRoutes */
11+
final class FastSettings implements Settings
12+
{
13+
/**
14+
* @param RouteParser|class-string<RouteParser> $routeParser
15+
* @param DataGenerator|class-string<DataGenerator> $dataGenerator
16+
* @param Dispatcher|class-string<Dispatcher> $dispatcher
17+
* @param ConfigureRoutes|class-string<ConfigureRoutes> $routesConfiguration
18+
* @param GenerateUri|class-string<GenerateUri> $uriGenerator
19+
* @param Cache|class-string<Cache>|null $cacheDriver
20+
*/
21+
public function __construct(
22+
private RouteParser|string $routeParser = RouteParser\Std::class,
23+
private DataGenerator|string $dataGenerator = DataGenerator\MarkBased::class,
24+
private Dispatcher|string $dispatcher = Dispatcher\MarkBased::class,
25+
private ConfigureRoutes|string $routesConfiguration = RouteCollector::class,
26+
private GenerateUri|string $uriGenerator = GenerateUri\FromProcessedConfiguration::class,
27+
private Cache|string|null $cacheDriver = FileCache::class,
28+
) {
29+
}
30+
31+
public function getRouteParser(): RouteParser
32+
{
33+
if (is_string($this->routeParser)) {
34+
$this->routeParser = new $this->routeParser();
35+
}
36+
37+
return $this->routeParser;
38+
}
39+
40+
public function getDataGenerator(): DataGenerator
41+
{
42+
if (is_string($this->dataGenerator)) {
43+
$this->dataGenerator = new $this->dataGenerator();
44+
}
45+
46+
return $this->dataGenerator;
47+
}
48+
49+
public function getDispatcher(): Dispatcher
50+
{
51+
if (is_string($this->dispatcher)) {
52+
$this->dispatcher = new $this->dispatcher();
53+
}
54+
55+
return $this->dispatcher;
56+
}
57+
58+
public function getRoutesConfiguration(): ConfigureRoutes
59+
{
60+
if (is_string($this->routesConfiguration)) {
61+
$this->routesConfiguration = new $this->routesConfiguration($this->getRouteParser());
62+
}
63+
64+
return $this->routesConfiguration;
65+
}
66+
67+
public function getUriGenerator(): GenerateUri
68+
{
69+
if (is_string($this->uriGenerator)) {
70+
$this->uriGenerator = new $this->uriGenerator();
71+
}
72+
73+
return $this->uriGenerator;
74+
}
75+
76+
public function getCacheDriver(): ?Cache
77+
{
78+
if (is_string($this->cacheDriver)) {
79+
$this->cacheDriver = new $this->cacheDriver();
80+
}
81+
82+
return $this->cacheDriver;
83+
}
84+
85+
public static function recommended(): self
86+
{
87+
return new self(
88+
RouteParser\Std::class,
89+
DataGenerator\MarkBased::class,
90+
Dispatcher\MarkBased::class,
91+
RouteCollector::class,
92+
GenerateUri\FromProcessedConfiguration::class,
93+
FileCache::class,
94+
);
95+
}
96+
97+
public function disableCache(): self
98+
{
99+
return new self(
100+
$this->routeParser,
101+
$this->dataGenerator,
102+
$this->dispatcher,
103+
$this->routesConfiguration,
104+
$this->uriGenerator,
105+
null,
106+
);
107+
}
108+
109+
/** @param Cache|class-string<Cache> $driver */
110+
public function withCache(Cache|string $driver): self
111+
{
112+
return new self(
113+
$this->routeParser,
114+
$this->dataGenerator,
115+
$this->dispatcher,
116+
$this->routesConfiguration,
117+
$this->uriGenerator,
118+
$driver,
119+
);
120+
}
121+
122+
public function useCharCountDispatcher(): self
123+
{
124+
return $this->useCustomDispatcher(
125+
DataGenerator\CharCountBased::class,
126+
Dispatcher\CharCountBased::class,
127+
);
128+
}
129+
130+
public function useGroupCountDispatcher(): self
131+
{
132+
return $this->useCustomDispatcher(
133+
DataGenerator\GroupCountBased::class,
134+
Dispatcher\GroupCountBased::class,
135+
);
136+
}
137+
138+
public function useGroupPosDispatcher(): self
139+
{
140+
return $this->useCustomDispatcher(
141+
DataGenerator\GroupPosBased::class,
142+
Dispatcher\GroupPosBased::class,
143+
);
144+
}
145+
146+
public function useMarkDispatcher(): self
147+
{
148+
return $this->useCustomDispatcher(
149+
DataGenerator\MarkBased::class,
150+
Dispatcher\MarkBased::class,
151+
);
152+
}
153+
154+
/**
155+
* @param DataGenerator|class-string<DataGenerator> $dataGenerator
156+
* @param Dispatcher|class-string<Dispatcher> $dispatcher
157+
*/
158+
public function useCustomDispatcher(DataGenerator|string $dataGenerator, Dispatcher|string $dispatcher): self
159+
{
160+
return new self(
161+
$this->routeParser,
162+
$dataGenerator,
163+
$dispatcher,
164+
$this->routesConfiguration,
165+
$this->uriGenerator,
166+
$this->cacheDriver,
167+
);
168+
}
169+
170+
/** @param GenerateUri|class-string<GenerateUri> $uriGenerator */
171+
public function withUriGenerator(GenerateUri|string $uriGenerator): self
172+
{
173+
return new self(
174+
$this->routeParser,
175+
$this->dataGenerator,
176+
$this->dispatcher,
177+
$this->routesConfiguration,
178+
$uriGenerator,
179+
$this->cacheDriver,
180+
);
181+
}
182+
}

src/GenerateUri.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*/
1313
interface GenerateUri
1414
{
15+
/** @param ParsedRoutes $processedConfiguration */
1516
public function with(array $processedConfiguration): self;
1617

1718
/**

0 commit comments

Comments
 (0)