Skip to content

Commit a536bab

Browse files
authored
Merge pull request #255 from true2trance/master
Added Subdomain API Router Support
2 parents 3085e01 + ac70e50 commit a536bab

File tree

4 files changed

+69
-17
lines changed

4 files changed

+69
-17
lines changed

src/Mpociot/ApiDoc/Commands/GenerateDocumentation.php

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class GenerateDocumentation extends Command
2222
*/
2323
protected $signature = 'api:generate
2424
{--output=public/docs : The output path for the generated documentation}
25-
{--routePrefix= : The route prefix to use for generation}
25+
{--routeDomain= : The route domain (or domains) to use for generation}
26+
{--routePrefix= : The route prefix (or prefixes) to use for generation}
2627
{--routes=* : The route names to use for generation}
2728
{--middleware= : The middleware to use for generation}
2829
{--noResponseCalls : Disable API response calls}
@@ -68,30 +69,36 @@ public function handle()
6869
}
6970

7071
$allowedRoutes = $this->option('routes');
72+
$routeDomain = $this->option('routeDomain');
7173
$routePrefix = $this->option('routePrefix');
7274
$middleware = $this->option('middleware');
7375

7476
$this->setUserToBeImpersonated($this->option('actAsUserId'));
7577

76-
if ($routePrefix === null && ! count($allowedRoutes) && $middleware === null) {
77-
$this->error('You must provide either a route prefix or a route or a middleware to generate the documentation.');
78+
if ($routePrefix === null && $routeDomain === null && ! count($allowedRoutes) && $middleware === null) {
79+
$this->error('You must provide either a route prefix, a route domain, a route or a middleware to generate the documentation.');
7880

7981
return false;
8082
}
8183

8284
$generator->prepareMiddleware($this->option('useMiddlewares'));
8385

84-
$routePrefixes = explode(',', $routePrefix);
86+
$routePrefixes = explode(',', $routePrefix ?: '*');
87+
$routeDomains = explode(',', $routeDomain ?: '*');
8588

8689
$parsedRoutes = [];
8790

8891
if ($this->option('router') === 'laravel') {
89-
foreach ($routePrefixes as $routePrefix) {
90-
$parsedRoutes += $this->processLaravelRoutes($generator, $allowedRoutes, $routePrefix, $middleware);
92+
foreach ($routeDomains as $routeDomain) {
93+
foreach ($routePrefixes as $routePrefix) {
94+
$parsedRoutes += $this->processLaravelRoutes($generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware);
95+
}
9196
}
9297
} else {
93-
foreach ($routePrefixes as $routePrefix) {
94-
$parsedRoutes += $this->processDingoRoutes($generator, $allowedRoutes, $routePrefix, $middleware);
98+
foreach ($routeDomains as $routeDomain) {
99+
foreach ($routePrefixes as $routePrefix) {
100+
$parsedRoutes += $this->processDingoRoutes($generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware);
101+
}
95102
}
96103
}
97104
$parsedRoutes = collect($parsedRoutes)->groupBy('resource')->sort(function ($a, $b) {
@@ -252,18 +259,23 @@ private function getRoutes()
252259
/**
253260
* @param AbstractGenerator $generator
254261
* @param $allowedRoutes
262+
* @param $routeDomain
255263
* @param $routePrefix
256264
*
257265
* @return array
258266
*/
259-
private function processLaravelRoutes(AbstractGenerator $generator, $allowedRoutes, $routePrefix, $middleware)
267+
private function processLaravelRoutes(AbstractGenerator $generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware)
260268
{
261269
$withResponse = $this->option('noResponseCalls') === false;
262270
$routes = $this->getRoutes();
263271
$bindings = $this->getBindings();
264272
$parsedRoutes = [];
265273
foreach ($routes as $route) {
266-
if (in_array($route->getName(), $allowedRoutes) || str_is($routePrefix, $generator->getUri($route)) || in_array($middleware, $route->middleware())) {
274+
if (in_array($route->getName(), $allowedRoutes)
275+
|| (str_is($routeDomain, $generator->getDomain($route))
276+
&& str_is($routePrefix, $generator->getUri($route)))
277+
|| in_array($middleware, $route->middleware())
278+
) {
267279
if ($this->isValidRoute($route) && $this->isRouteVisibleForDocumentation($route->getAction()['uses'])) {
268280
$parsedRoutes[] = $generator->processRoute($route, $bindings, $this->option('header'), $withResponse);
269281
$this->info('Processed route: ['.implode(',', $generator->getMethods($route)).'] '.$generator->getUri($route));
@@ -279,18 +291,25 @@ private function processLaravelRoutes(AbstractGenerator $generator, $allowedRout
279291
/**
280292
* @param AbstractGenerator $generator
281293
* @param $allowedRoutes
294+
* @param $routeDomain
282295
* @param $routePrefix
283296
*
284297
* @return array
285298
*/
286-
private function processDingoRoutes(AbstractGenerator $generator, $allowedRoutes, $routePrefix, $middleware)
299+
private function processDingoRoutes(AbstractGenerator $generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware)
287300
{
288301
$withResponse = $this->option('noResponseCalls') === false;
289302
$routes = $this->getRoutes();
290303
$bindings = $this->getBindings();
291304
$parsedRoutes = [];
292305
foreach ($routes as $route) {
293-
if (empty($allowedRoutes) || in_array($route->getName(), $allowedRoutes) || str_is($routePrefix, $route->uri()) || in_array($middleware, $route->middleware())) {
306+
if (empty($allowedRoutes)
307+
// TODO extract this into a method
308+
|| in_array($route->getName(), $allowedRoutes)
309+
|| (str_is($routeDomain, $generator->getDomain($route))
310+
&& str_is($routePrefix, $generator->getUri($route)))
311+
|| in_array($middleware, $route->middleware())
312+
) {
294313
if ($this->isValidRoute($route) && $this->isRouteVisibleForDocumentation($route->getAction()['uses'])) {
295314
$parsedRoutes[] = $generator->processRoute($route, $bindings, $this->option('header'), $withResponse);
296315
$this->info('Processed route: ['.implode(',', $route->getMethods()).'] '.$route->uri());

src/Mpociot/ApiDoc/Generators/AbstractGenerator.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414

1515
abstract class AbstractGenerator
1616
{
17+
/**
18+
* @param $route
19+
*
20+
* @return mixed
21+
*/
22+
abstract public function getDomain($route);
23+
1724
/**
1825
* @param $route
1926
*

src/Mpociot/ApiDoc/Generators/DingoGenerator.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,14 @@ public function callRoute($method, $uri, $parameters = [], $cookies = [], $files
6868
return call_user_func_array([$dispatcher, strtolower($method)], [$uri]);
6969
}
7070

71+
/**
72+
* {@inheritdoc}
73+
*/
74+
public function getDomain($route)
75+
{
76+
return $route->domain();
77+
}
78+
7179
/**
7280
* {@inheritdoc}
7381
*/

src/Mpociot/ApiDoc/Generators/LaravelGenerator.php

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,31 @@
22

33
namespace Mpociot\ApiDoc\Generators;
44

5-
use ReflectionClass;
6-
use League\Fractal\Manager;
5+
use Illuminate\Foundation\Http\FormRequest;
76
use Illuminate\Routing\Route;
8-
use League\Fractal\Resource\Item;
7+
use Illuminate\Routing\RouteUrlGenerator;
98
use Illuminate\Support\Facades\App;
10-
use Mpociot\Reflection\DocBlock\Tag;
119
use Illuminate\Support\Facades\Request;
10+
use Illuminate\Support\Facades\URL;
11+
use League\Fractal\Manager;
1212
use League\Fractal\Resource\Collection;
13-
use Illuminate\Foundation\Http\FormRequest;
13+
use League\Fractal\Resource\Item;
14+
use Mpociot\Reflection\DocBlock\Tag;
15+
use ReflectionClass;
1416

1517
class LaravelGenerator extends AbstractGenerator
1618
{
19+
/**
20+
* @param Route $route
21+
*
22+
* @return mixed
23+
*/
24+
public function getDomain($route)
25+
{
26+
return $route->domain();
27+
}
28+
29+
1730
/**
1831
* @param Route $route
1932
*
@@ -56,11 +69,16 @@ public function processRoute($route, $bindings = [], $headers = [], $withRespons
5669
{
5770
$content = '';
5871

72+
$routeDomain = $route->domain();
5973
$routeAction = $route->getAction();
6074
$routeGroup = $this->getRouteGroup($routeAction['uses']);
6175
$routeDescription = $this->getRouteDescription($routeAction['uses']);
6276
$showresponse = null;
6377

78+
// set correct route domain
79+
$headers[] = "HTTP_HOST: {$routeDomain}";
80+
$headers[] = "SERVER_NAME: {$routeDomain}";
81+
6482
if ($withResponse) {
6583
$response = null;
6684
$docblockResponse = $this->getDocblockResponse($routeDescription['tags']);

0 commit comments

Comments
 (0)