Skip to content

Commit 63765ff

Browse files
committed
add explicit static constructors
1 parent 6d823ce commit 63765ff

2 files changed

Lines changed: 58 additions & 34 deletions

File tree

src/OpenApiRouteLoader.php

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,24 @@ class OpenApiRouteLoader implements RouteLoaderInterface
2222
*/
2323
private $routeNames = [];
2424

25-
public function __construct(
26-
?Finder $finder = null
27-
) {
28-
if (null === $finder) {
29-
// try to use the symfony flex default src directory based on a composer install
30-
$srcDir = __DIR__.'/../../../../src';
31-
$realPath = realpath($srcDir);
32-
if (!$realPath || !is_dir($realPath)) {
33-
throw new \LogicException(sprintf('The default directory to look for OpenAPI/Swagger annotations "%s" does not exist. Please configure the finder explicitly.'));
34-
}
25+
public function __construct(Finder $finder)
26+
{
27+
$this->finder = $finder;
28+
}
3529

36-
$finder = (new Finder())->in($realPath)->files()->name('*.php')->sortByName()->followLinks();
37-
}
30+
public static function fromDirectories(string $dir, string ...$moreDirs): self
31+
{
32+
return new self(
33+
(new Finder())->in($dir)->in($moreDirs)->files()->name('*.php')->sortByName()->followLinks()
34+
);
35+
}
3836

39-
$this->finder = $finder;
37+
/**
38+
* Looks for OpenAPI/Swagger annotations in the symfony flex default "src" directory based on a composer install.
39+
*/
40+
public static function fromSrcDirectory(): self
41+
{
42+
return self::fromDirectories(__DIR__.'/../../../../src');
4043
}
4144

4245
public function __invoke(): RouteCollection

tests/OpenApiRouteLoaderTest.php

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Tobion\OpenApiSymfonyRouting\Tests;
66

77
use PHPUnit\Framework\TestCase;
8+
use Symfony\Component\Finder\Exception\DirectoryNotFoundException;
89
use Symfony\Component\Finder\Finder;
910
use Symfony\Component\Routing\Route;
1011
use Symfony\Component\Routing\RouteCollection;
@@ -25,8 +26,7 @@ class OpenApiRouteLoaderTest extends TestCase
2526

2627
public function testBasic(): void
2728
{
28-
$finder = (new Finder())->in(__DIR__.'/Fixtures/Basic');
29-
$routeLoader = new OpenApiRouteLoader($finder);
29+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/Basic');
3030

3131
$routes = $routeLoader->__invoke();
3232

@@ -36,13 +36,12 @@ public function testBasic(): void
3636
(new Route('/foobar'))->setMethods('GET')->setDefault('_controller', BasicController::class.'::__invoke')
3737
);
3838

39-
$this->assertEquals($expectedRoutes, $routes);
39+
self::assertEquals($expectedRoutes, $routes);
4040
}
4141

4242
public function testFormatSuffix(): void
4343
{
44-
$finder = (new Finder())->in(__DIR__.'/Fixtures/FormatSuffix');
45-
$routeLoader = new OpenApiRouteLoader($finder);
44+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/FormatSuffix');
4645

4746
$routes = $routeLoader->__invoke();
4847

@@ -60,13 +59,12 @@ public function testFormatSuffix(): void
6059
(new Route('/c'))->setMethods('GET')->setDefault('_controller', FormatSuffixController::class.'::disableFormatSuffix')
6160
);
6261

63-
$this->assertEquals($expectedRoutes, $routes);
62+
self::assertEquals($expectedRoutes, $routes);
6463
}
6564

6665
public function testOperationId(): void
6766
{
68-
$finder = (new Finder())->in(__DIR__.'/Fixtures/OperationId');
69-
$routeLoader = new OpenApiRouteLoader($finder);
67+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/OperationId');
7068

7169
$routes = $routeLoader->__invoke();
7270

@@ -76,13 +74,12 @@ public function testOperationId(): void
7674
(new Route('/foobar'))->setMethods('GET')->setDefault('_controller', OperationIdController::class.'::__invoke')
7775
);
7876

79-
$this->assertEquals($expectedRoutes, $routes);
77+
self::assertEquals($expectedRoutes, $routes);
8078
}
8179

8280
public function testPathParameterPattern(): void
8381
{
84-
$finder = (new Finder())->in(__DIR__.'/Fixtures/PathParameterPattern');
85-
$routeLoader = new OpenApiRouteLoader($finder);
82+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/PathParameterPattern');
8683

8784
$routes = $routeLoader->__invoke();
8885

@@ -97,13 +94,12 @@ public function testPathParameterPattern(): void
9794
(new Route('/bar/{id}'))->setRequirement('id', '^[a-zA-Z0-9]+$')->setMethods('GET')->setDefault('_controller', PathParameterPatternController::class.'::withPattern')
9895
);
9996

100-
$this->assertEquals($expectedRoutes, $routes);
97+
self::assertEquals($expectedRoutes, $routes);
10198
}
10299

103100
public function testSeveralClasses(): void
104101
{
105-
$finder = (new Finder())->in(__DIR__.'/Fixtures/SeveralClasses')->files();
106-
$routeLoader = new OpenApiRouteLoader($finder);
102+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/SeveralClasses');
107103

108104
$routes = $routeLoader->__invoke();
109105

@@ -121,13 +117,12 @@ public function testSeveralClasses(): void
121117
(new Route('/sub'))->setMethods('GET')->setDefault('_controller', SubController::class.'::__invoke')
122118
);
123119

124-
$this->assertEquals($expectedRoutes, $routes);
120+
self::assertEquals($expectedRoutes, $routes);
125121
}
126122

127123
public function testSeveralHttpMethods(): void
128124
{
129-
$finder = (new Finder())->in(__DIR__.'/Fixtures/SeveralHttpMethods');
130-
$routeLoader = new OpenApiRouteLoader($finder);
125+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/SeveralHttpMethods');
131126

132127
$routes = $routeLoader->__invoke();
133128

@@ -149,13 +144,12 @@ public function testSeveralHttpMethods(): void
149144
(new Route('/foobar'))->setMethods('DELETE')->setDefault('_controller', SeveralHttpMethodsController::class.'::delete')
150145
);
151146

152-
$this->assertEquals($expectedRoutes, $routes);
147+
self::assertEquals($expectedRoutes, $routes);
153148
}
154149

155150
public function testSeveralRoutesOnOneAction(): void
156151
{
157-
$finder = (new Finder())->in(__DIR__.'/Fixtures/SeveralRoutesOnOneAction');
158-
$routeLoader = new OpenApiRouteLoader($finder);
152+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/SeveralRoutesOnOneAction');
159153

160154
$routes = $routeLoader->__invoke();
161155

@@ -173,6 +167,33 @@ public function testSeveralRoutesOnOneAction(): void
173167
(new Route('/foo-bar'))->setMethods('GET')->setDefault('_controller', SeveralRoutesOnOneActionController::class.'::__invoke')
174168
);
175169

176-
$this->assertEquals($expectedRoutes, $routes);
170+
self::assertEquals($expectedRoutes, $routes);
171+
}
172+
173+
public function testSeveralDirectories(): void
174+
{
175+
$routeLoader = OpenApiRouteLoader::fromDirectories(__DIR__.'/Fixtures/Basic', __DIR__.'/Fixtures/SeveralClasses/SubNamespace');
176+
177+
$routes = $routeLoader->__invoke();
178+
179+
$expectedRoutes = new RouteCollection();
180+
$expectedRoutes->add(
181+
self::FIXTURES_ROUTE_NAME_PREFIX.'basic__invoke',
182+
(new Route('/foobar'))->setMethods('GET')->setDefault('_controller', BasicController::class.'::__invoke')
183+
);
184+
$expectedRoutes->add(
185+
self::FIXTURES_ROUTE_NAME_PREFIX.'severalclasses_subnamespace_sub__invoke',
186+
(new Route('/sub'))->setMethods('GET')->setDefault('_controller', SubController::class.'::__invoke')
187+
);
188+
189+
self::assertEquals($expectedRoutes, $routes);
190+
}
191+
192+
public function testSrcDirectoryDoesNotExist(): void
193+
{
194+
self::expectException(DirectoryNotFoundException::class);
195+
self::expectExceptionMessage('/../../../../src" directory does not exist');
196+
197+
OpenApiRouteLoader::fromSrcDirectory();
177198
}
178199
}

0 commit comments

Comments
 (0)