33namespace Mpociot \ApiDoc \Commands ;
44
55use Illuminate \Console \Command ;
6- use Mpociot \ ApiDoc \ ApiDocGenerator ;
6+ use Illuminate \ Support \ Collection ;
77use Illuminate \Support \Facades \Route ;
8+ use Mpociot \ApiDoc \Generators \AbstractGenerator ;
9+ use Mpociot \ApiDoc \Generators \DingoGenerator ;
10+ use Mpociot \ApiDoc \Generators \LaravelGenerator ;
811use Mpociot \Documentarian \Documentarian ;
912
1013class GenerateDocumentation extends Command
@@ -19,6 +22,8 @@ class GenerateDocumentation extends Command
1922 {--routePrefix= : The route prefix to use for generation}
2023 {--routes=* : The route names to use for generation}
2124 {--actAsUserId= : The user ID to use for API response calls}
25+ {--router=laravel : The router to be used (Laravel or Dingo)}
26+ {--bindings= : Route Model Bindings}
2227 ' ;
2328
2429 /**
@@ -45,46 +50,35 @@ public function __construct()
4550 */
4651 public function handle ()
4752 {
53+ if ($ this ->option ('router ' ) === 'laravel ' ) {
54+ $ generator = new LaravelGenerator ();
55+ } else {
56+ $ generator = new DingoGenerator ();
57+ }
58+
4859 $ allowedRoutes = $ this ->option ('routes ' );
4960 $ routePrefix = $ this ->option ('routePrefix ' );
50- $ actAs = $ this ->option ('actAsUserId ' );
61+
62+ $ this ->setUserToBeImpersonated ($ this ->option ('actAsUserId ' ));
5163
5264 if ($ routePrefix === null && ! count ($ allowedRoutes )) {
5365 $ this ->error ('You must provide either a route prefix or a route to generate the documentation. ' );
5466
5567 return false ;
5668 }
5769
58- if ($ actAs !== null ) {
59- if (version_compare ($ this ->laravel ->version (), '5.2.0 ' , '< ' )) {
60- $ userModel = config ('auth.model ' );
61- $ user = $ userModel ::find ($ actAs );
62- $ this ->laravel ['auth ' ]->setUser ($ user );
63- } else {
64- $ userModel = config ('auth.providers.users.model ' );
65- $ user = $ userModel ::find ($ actAs );
66- $ this ->laravel ['auth ' ]->guard ()->setUser ($ user );
67- }
68- }
69-
70- $ routes = Route::getRoutes ();
71-
72- $ generator = new ApiDocGenerator ();
73-
74- /* @var \Illuminate\Routing\Route $route */
75- $ parsedRoutes = [];
76- foreach ($ routes as $ route ) {
77- if (in_array ($ route ->getName (), $ allowedRoutes ) || str_is ($ routePrefix , $ route ->getUri ())) {
78- $ parsedRoutes [] = $ generator ->processRoute ($ route );
79- $ this ->info ('Processed route: ' .$ route ->getUri ());
80- }
70+ if ($ this ->option ('router ' ) === 'laravel ' ) {
71+ $ parsedRoutes = $ this ->processLaravelRoutes ($ generator , $ allowedRoutes , $ routePrefix );
72+ } else {
73+ $ parsedRoutes = $ this ->processDingoRoutes ($ generator , $ allowedRoutes , $ routePrefix );
8174 }
75+ $ parsedRoutes = collect ($ parsedRoutes )->sortBy ('resource ' )->groupBy ('resource ' );
8276
8377 $ this ->writeMarkdown ($ parsedRoutes );
8478 }
8579
8680 /**
87- * @param array $parsedRoutes
81+ * @param Collection $parsedRoutes
8882 *
8983 * @return void
9084 */
@@ -94,7 +88,7 @@ private function writeMarkdown($parsedRoutes)
9488
9589 $ documentarian = new Documentarian ();
9690
97- $ markdown = view ('apidoc::documentarian ' )->with ('parsedRoutes ' , $ parsedRoutes );
91+ $ markdown = view ('apidoc::documentarian ' )->with ('parsedRoutes ' , $ parsedRoutes-> all () );
9892
9993 if (! is_dir ($ outputPath )) {
10094 $ documentarian ->create ($ outputPath );
@@ -110,4 +104,92 @@ private function writeMarkdown($parsedRoutes)
110104
111105 $ this ->info ('Wrote HTML documentation to: ' .$ outputPath .'/public/index.html ' );
112106 }
107+
108+ /**
109+ * @return array
110+ */
111+ private function getBindings ()
112+ {
113+ $ bindings = $ this ->option ('bindings ' );
114+ if (empty ($ bindings )) {
115+ return [];
116+ }
117+ $ bindings = explode ('| ' , $ bindings );
118+ $ resultBindings = [];
119+ foreach ($ bindings as $ binding ) {
120+ list ($ name , $ id ) = explode (', ' , $ binding );
121+ $ resultBindings [$ name ] = $ id ;
122+ }
123+ return $ resultBindings ;
124+ }
125+
126+ /**
127+ * @param $actAs
128+ */
129+ private function setUserToBeImpersonated ($ actAs )
130+ {
131+ if (!empty ($ actAs )) {
132+ if (version_compare ($ this ->laravel ->version (), '5.2.0 ' , '< ' )) {
133+ $ userModel = config ('auth.model ' );
134+ $ user = $ userModel ::find ($ actAs );
135+ $ this ->laravel ['auth ' ]->setUser ($ user );
136+ } else {
137+ $ userModel = config ('auth.providers.users.model ' );
138+ $ user = $ userModel ::find ($ actAs );
139+ $ this ->laravel ['auth ' ]->guard ()->setUser ($ user );
140+ }
141+ }
142+ }
143+
144+ /**
145+ * @return mixed
146+ */
147+ private function getRoutes ()
148+ {
149+ if ($ this ->option ('router ' ) === 'laravel ' ) {
150+ return Route::getRoutes ();
151+ } else {
152+ return app ('Dingo\Api\Routing\Router ' )->getRoutes ()[$ this ->option ('routePrefix ' )];
153+ }
154+ }
155+
156+ /**
157+ * @param AbstractGenerator $generator
158+ * @param $allowedRoutes
159+ * @param $routePrefix
160+ * @return array
161+ */
162+ private function processLaravelRoutes (AbstractGenerator $ generator , $ allowedRoutes , $ routePrefix )
163+ {
164+ $ routes = $ this ->getRoutes ();
165+ $ bindings = $ this ->getBindings ();
166+ $ parsedRoutes = [];
167+ foreach ($ routes as $ route ) {
168+ if (in_array ($ route ->getName (), $ allowedRoutes ) || str_is ($ routePrefix , $ route ->getUri ())) {
169+ $ parsedRoutes [] = $ generator ->processRoute ($ route , $ bindings );
170+ $ this ->info ('Processed route: ' .$ route ->getUri ());
171+ }
172+ }
173+ return $ parsedRoutes ;
174+ }
175+
176+ /**
177+ * @param AbstractGenerator $generator
178+ * @param $allowedRoutes
179+ * @param $routePrefix
180+ * @return array
181+ */
182+ private function processDingoRoutes (AbstractGenerator $ generator , $ allowedRoutes , $ routePrefix )
183+ {
184+ $ routes = $ this ->getRoutes ();
185+ $ bindings = $ this ->getBindings ();
186+ $ parsedRoutes = [];
187+ foreach ($ routes as $ route ) {
188+ if (empty ($ allowedRoutes ) || in_array ($ route ->getName (), $ allowedRoutes ) || str_is ($ routePrefix , $ route ->uri ())) {
189+ $ parsedRoutes [] = $ generator ->processRoute ($ route , $ bindings );
190+ $ this ->info ('Processed route: ' .$ route ->uri ());
191+ }
192+ }
193+ return $ parsedRoutes ;
194+ }
113195}
0 commit comments