mirror of
https://github.com/ambieco/scribe.git
synced 2026-04-23 10:06:51 +08:00
Merge pull request #255 from true2trance/master
Added Subdomain API Router Support
This commit is contained in:
@@ -22,7 +22,8 @@ class GenerateDocumentation extends Command
|
||||
*/
|
||||
protected $signature = 'api:generate
|
||||
{--output=public/docs : The output path for the generated documentation}
|
||||
{--routePrefix= : The route prefix to use for generation}
|
||||
{--routeDomain= : The route domain (or domains) to use for generation}
|
||||
{--routePrefix= : The route prefix (or prefixes) to use for generation}
|
||||
{--routes=* : The route names to use for generation}
|
||||
{--middleware= : The middleware to use for generation}
|
||||
{--noResponseCalls : Disable API response calls}
|
||||
@@ -68,30 +69,36 @@ 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, a route domain, a route or a middleware to generate the documentation.');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$generator->prepareMiddleware($this->option('useMiddlewares'));
|
||||
|
||||
$routePrefixes = explode(',', $routePrefix);
|
||||
$routePrefixes = explode(',', $routePrefix ?: '*');
|
||||
$routeDomains = explode(',', $routeDomain ?: '*');
|
||||
|
||||
$parsedRoutes = [];
|
||||
|
||||
if ($this->option('router') === 'laravel') {
|
||||
foreach ($routePrefixes as $routePrefix) {
|
||||
$parsedRoutes += $this->processLaravelRoutes($generator, $allowedRoutes, $routePrefix, $middleware);
|
||||
foreach ($routeDomains as $routeDomain) {
|
||||
foreach ($routePrefixes as $routePrefix) {
|
||||
$parsedRoutes += $this->processLaravelRoutes($generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($routePrefixes as $routePrefix) {
|
||||
$parsedRoutes += $this->processDingoRoutes($generator, $allowedRoutes, $routePrefix, $middleware);
|
||||
foreach ($routeDomains as $routeDomain) {
|
||||
foreach ($routePrefixes as $routePrefix) {
|
||||
$parsedRoutes += $this->processDingoRoutes($generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware);
|
||||
}
|
||||
}
|
||||
}
|
||||
$parsedRoutes = collect($parsedRoutes)->groupBy('resource')->sort(function ($a, $b) {
|
||||
@@ -252,18 +259,23 @@ 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));
|
||||
@@ -279,18 +291,25 @@ class GenerateDocumentation extends Command
|
||||
/**
|
||||
* @param AbstractGenerator $generator
|
||||
* @param $allowedRoutes
|
||||
* @param $routeDomain
|
||||
* @param $routePrefix
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function processDingoRoutes(AbstractGenerator $generator, $allowedRoutes, $routePrefix, $middleware)
|
||||
private function processDingoRoutes(AbstractGenerator $generator, $allowedRoutes, $routeDomain, $routePrefix, $middleware)
|
||||
{
|
||||
$withResponse = $this->option('noResponseCalls') === false;
|
||||
$routes = $this->getRoutes();
|
||||
$bindings = $this->getBindings();
|
||||
$parsedRoutes = [];
|
||||
foreach ($routes as $route) {
|
||||
if (empty($allowedRoutes) || in_array($route->getName(), $allowedRoutes) || str_is($routePrefix, $route->uri()) || in_array($middleware, $route->middleware())) {
|
||||
if (empty($allowedRoutes)
|
||||
// TODO extract this into a method
|
||||
|| 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(',', $route->getMethods()).'] '.$route->uri());
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -68,6 +68,14 @@ class DingoGenerator extends AbstractGenerator
|
||||
return call_user_func_array([$dispatcher, strtolower($method)], [$uri]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDomain($route)
|
||||
{
|
||||
return $route->domain();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
*
|
||||
@@ -56,11 +69,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']);
|
||||
|
||||
Reference in New Issue
Block a user