Added Subdomain API Router Support

This commit is contained in:
Bogdan Shtybin
2017-12-28 19:30:25 +02:00
parent 2d4cf80ef7
commit f8564b60ff
4 changed files with 53 additions and 13 deletions

View File

@@ -22,6 +22,7 @@ class GenerateDocumentation extends Command
*/
protected $signature = 'api:generate
{--output=public/docs : The output path for the generated documentation}
{--routeDomain= : The route domain to use for generation}
{--routePrefix= : The route prefix to use for generation}
{--routes=* : The route names to use for generation}
{--middleware= : The middleware to use for generation}
@@ -68,13 +69,14 @@ class GenerateDocumentation extends Command
}
$allowedRoutes = $this->option('routes');
$routeDomain = $this->option('routeDomain');
$routePrefix = $this->option('routePrefix');
$middleware = $this->option('middleware');
$this->setUserToBeImpersonated($this->option('actAsUserId'));
if ($routePrefix === null && ! count($allowedRoutes) && $middleware === null) {
$this->error('You must provide either a route prefix or a route or a middleware to generate the documentation.');
if ($routePrefix === null && $routeDomain === null && ! count($allowedRoutes) && $middleware === null) {
$this->error('You must provide either a route prefix or a route domain a route or a middleware to generate the documentation.');
return false;
}
@@ -82,8 +84,9 @@ class GenerateDocumentation extends Command
$generator->prepareMiddleware($this->option('useMiddlewares'));
if ($this->option('router') === 'laravel') {
$parsedRoutes = $this->processLaravelRoutes($generator, $allowedRoutes, $routePrefix, $middleware);
$parsedRoutes = $this->processLaravelRoutes($generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware);
} else {
// TODO: implement Dingo domain route filter
$parsedRoutes = $this->processDingoRoutes($generator, $allowedRoutes, $routePrefix, $middleware);
}
$parsedRoutes = collect($parsedRoutes)->groupBy('resource')->sort(function ($a, $b) {
@@ -248,18 +251,22 @@ class GenerateDocumentation extends Command
/**
* @param AbstractGenerator $generator
* @param $allowedRoutes
* @param $routeDomain
* @param $routePrefix
*
* @return array
*/
private function processLaravelRoutes(AbstractGenerator $generator, $allowedRoutes, $routePrefix, $middleware)
private function processLaravelRoutes(AbstractGenerator $generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware)
{
$withResponse = $this->option('noResponseCalls') === false;
$routes = $this->getRoutes();
$bindings = $this->getBindings();
$parsedRoutes = [];
foreach ($routes as $route) {
if (in_array($route->getName(), $allowedRoutes) || str_is($routePrefix, $generator->getUri($route)) || in_array($middleware, $route->middleware())) {
if (in_array($route->getName(), $allowedRoutes)
|| str_is($routeDomain, $generator->getDomain($route))
|| str_is($routePrefix, $generator->getUri($route))
|| in_array($middleware, $route->middleware())) {
if ($this->isValidRoute($route) && $this->isRouteVisibleForDocumentation($route->getAction()['uses'])) {
$parsedRoutes[] = $generator->processRoute($route, $bindings, $this->option('header'), $withResponse);
$this->info('Processed route: ['.implode(',', $generator->getMethods($route)).'] '.$generator->getUri($route));

View File

@@ -14,6 +14,13 @@ use Mpociot\ApiDoc\Parsers\RuleDescriptionParser as Description;
abstract class AbstractGenerator
{
/**
* @param $route
*
* @return mixed
*/
abstract public function getDomain($route);
/**
* @param $route
*

View File

@@ -68,6 +68,14 @@ class DingoGenerator extends AbstractGenerator
return call_user_func_array([$dispatcher, strtolower($method)], [$uri]);
}
/**
* {@inheritdoc}
*/
public function getDomain($route)
{
return $route->uri();
}
/**
* {@inheritdoc}
*/

View File

@@ -2,18 +2,31 @@
namespace Mpociot\ApiDoc\Generators;
use ReflectionClass;
use League\Fractal\Manager;
use Illuminate\Routing\Route;
use League\Fractal\Resource\Item;
use Illuminate\Support\Facades\App;
use Mpociot\Reflection\DocBlock\Tag;
use Illuminate\Support\Facades\Request;
use League\Fractal\Resource\Collection;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Routing\Route;
use Illuminate\Routing\RouteUrlGenerator;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\URL;
use League\Fractal\Manager;
use League\Fractal\Resource\Collection;
use League\Fractal\Resource\Item;
use Mpociot\Reflection\DocBlock\Tag;
use ReflectionClass;
class LaravelGenerator extends AbstractGenerator
{
/**
* @param Route $route
*
* @return mixed
*/
public function getDomain($route)
{
return $route->domain();
}
/**
* @param Route $route
*
@@ -54,11 +67,16 @@ class LaravelGenerator extends AbstractGenerator
{
$content = '';
$routeDomain = $route->domain();
$routeAction = $route->getAction();
$routeGroup = $this->getRouteGroup($routeAction['uses']);
$routeDescription = $this->getRouteDescription($routeAction['uses']);
$showresponse = null;
// set correct route domain
$headers[] = "HTTP_HOST: {$routeDomain}";
$headers[] = "SERVER_NAME: {$routeDomain}";
if ($withResponse) {
$response = null;
$docblockResponse = $this->getDocblockResponse($routeDescription['tags']);