RouteController.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. namespace Dcat\Admin\Controllers;
  3. use Dcat\Admin\Grid;
  4. use Dcat\Admin\Layout\Content;
  5. use Dcat\Admin\Layout\Row;
  6. use Illuminate\Routing\Controller;
  7. use Illuminate\Routing\Route;
  8. use Illuminate\Support\Arr;
  9. use Illuminate\Support\Str;
  10. class RouteController extends Controller
  11. {
  12. public function index()
  13. {
  14. $content = new Content;
  15. $content->header(trans('admin.routes'))->description(trans('admin.list'));
  16. $content->body(function (Row $row) {
  17. $colors = [
  18. 'GET' => 'primary',
  19. 'HEAD' => 'gray',
  20. 'POST' => 'green',
  21. 'PUT' => 'yellow',
  22. 'DELETE' => 'red',
  23. 'PATCH' => 'purple',
  24. 'OPTIONS'=> 'blue',
  25. ];
  26. $grid = new Grid;
  27. $grid->model()->setData(function (Grid\Model $model) {
  28. return $this->getModel()->setRoutes($this->getRoutes())->get($model);
  29. });
  30. $grid->number();
  31. $grid->method(trans('admin.method'))->map(function ($method) use ($colors) {
  32. return "<span class=\"label bg-{$colors[$method]}\">$method</span>";
  33. })->implode('&nbsp;');
  34. $grid->uri(trans('admin.uri'))->sortable()->display(function ($v) {
  35. return "<code>$v</code>";
  36. });
  37. $grid->name(trans('admin.alias'))->bold();
  38. $grid->action(trans('admin.route_action'))->display(function ($uri) {
  39. if ($uri === 'Closure') {
  40. return "<a class='badge bg-gray'>$uri</a>";
  41. }
  42. return preg_replace('/@.+/', '<code>$0</code>', $uri);
  43. });
  44. $grid->middleware(trans('admin.middleware'))->badge('gray');
  45. $grid->disablePagination();
  46. $grid->disableRowSelector();
  47. $grid->disableActions();
  48. $grid->disableCreateButton();
  49. $grid->disableExporter();
  50. $grid->disableQuickCreateButton();
  51. $grid->filter(function (Grid\Filter $filter) use ($colors) {
  52. $values = array_keys($colors);
  53. $filter->equal('method', trans('admin.method'))->select(array_combine($values, $values));
  54. $filter->equal('uri', trans('admin.uri'));
  55. $filter->equal('action', trans('admin.route_action'));
  56. });
  57. $row->column(12, $grid);
  58. });
  59. return $content;
  60. }
  61. protected function getModel()
  62. {
  63. return new class() {
  64. protected $routes;
  65. protected $where = [];
  66. public function setRoutes($routes)
  67. {
  68. $this->routes = $routes;
  69. return $this;
  70. }
  71. public function where($column, $condition)
  72. {
  73. $this->where[$column] = trim($condition);
  74. return $this;
  75. }
  76. public function orderBy()
  77. {
  78. return $this;
  79. }
  80. public function get(Grid\Model $model)
  81. {
  82. $model->getQueries()->unique()->each(function ($query) use (&$eloquent) {
  83. if ($query['method'] == 'paginate' || $query['method'] == 'get') {
  84. return;
  85. }
  86. call_user_func_array([$this, $query['method']], $query['arguments'] ?? []);
  87. });
  88. return $this->routes = collect($this->routes)->filter(function ($route) {
  89. foreach ($this->where as $column => $condition) {
  90. if (is_array($route[$column])) {
  91. if (!in_array($condition, $route[$column])) {
  92. return false;
  93. }
  94. } elseif (!Str::contains(strtolower($route[$column]), strtolower($condition))) {
  95. return false;
  96. }
  97. }
  98. return true;
  99. });
  100. }
  101. };
  102. }
  103. public function getRoutes()
  104. {
  105. $routes = collect(\Route::getRoutes())->map(function ($route) {
  106. return $this->getRouteInformation($route);
  107. })->all();
  108. if ($sort = request('_sort')) {
  109. $routes = $this->sortRoutes($sort, $routes);
  110. }
  111. return array_filter($routes);
  112. }
  113. /**
  114. * Get the route information for a given route.
  115. *
  116. * @param \Illuminate\Routing\Route $route
  117. *
  118. * @return array
  119. */
  120. protected function getRouteInformation(Route $route)
  121. {
  122. try {
  123. return [
  124. 'host' => $route->domain(),
  125. 'method' => $route->methods(),
  126. 'uri' => $route->uri(),
  127. 'name' => $route->getName(),
  128. 'action' => $route->getActionName(),
  129. 'middleware' => $this->getRouteMiddleware($route),
  130. ];
  131. } catch (\Exception $e) {
  132. return [
  133. 'host' => $route->domain(),
  134. 'method' => $route->methods(),
  135. 'uri' => $route->uri(),
  136. 'name' => $route->getName(),
  137. 'action' => '<span class="label label-danger">Undefined</span>',
  138. 'middleware' => $this->getRouteMiddleware($route),
  139. ];
  140. }
  141. }
  142. /**
  143. * Sort the routes by a given element.
  144. *
  145. * @param string $sort
  146. * @param array $routes
  147. *
  148. * @return array
  149. */
  150. protected function sortRoutes($sort, $routes)
  151. {
  152. return Arr::sort($routes, function ($route) use ($sort) {
  153. $column = $sort['column'];
  154. $type = $sort['type'];
  155. return $type === 'asc' ? !$route[$column] : $route[$column];
  156. });
  157. }
  158. /**
  159. * Get before filters.
  160. *
  161. * @param \Illuminate\Routing\Route $route
  162. *
  163. * @return string
  164. */
  165. protected function getRouteMiddleware($route)
  166. {
  167. return collect($route->gatherMiddleware())->map(function ($middleware) {
  168. return $middleware instanceof \Closure ? 'Closure' : $middleware;
  169. });
  170. }
  171. }