RouteController.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace Encore\Admin\Helpers\Controllers;
  3. use Encore\Admin\Facades\Admin;
  4. use Encore\Admin\Grid;
  5. use Encore\Admin\Layout\Content;
  6. use Illuminate\Database\Eloquent\Model;
  7. use Illuminate\Routing\Controller;
  8. use Illuminate\Routing\Route;
  9. use Illuminate\Support\Arr;
  10. use Illuminate\Support\Str;
  11. class RouteController extends Controller
  12. {
  13. public function index()
  14. {
  15. return Admin::content(function (Content $content) {
  16. $model = $this->getModel()->setRoutes($this->getRoutes());
  17. $content->body(Admin::grid($model, function (Grid $grid) {
  18. $colors = [
  19. 'GET' => 'green',
  20. 'HEAD' => 'gray',
  21. 'POST' => 'blue',
  22. 'PUT' => 'yellow',
  23. 'DELETE' => 'red',
  24. 'PATCH' => 'aqua',
  25. 'OPTIONS'=> 'light-blue',
  26. ];
  27. $grid->method()->map(function ($method) use ($colors) {
  28. return "<span class=\"label bg-{$colors[$method]}\">$method</span>";
  29. })->implode('&nbsp;');
  30. $grid->uri()->display(function ($uri) {
  31. return preg_replace('/\{.+?\}/', '<code>$0</span>', $uri);
  32. })->sortable();
  33. $grid->name();
  34. $grid->action()->display(function ($uri) {
  35. return preg_replace('/@.+/', '<code>$0</code>', $uri);
  36. });
  37. $grid->middleware()->badge('yellow');
  38. $grid->disablePagination();
  39. $grid->disableRowSelector();
  40. $grid->disableActions();
  41. $grid->disableCreation();
  42. $grid->disableExport();
  43. $grid->filter(function ($filter) {
  44. $filter->disableIdFilter();
  45. $filter->equal('action');
  46. $filter->equal('uri');
  47. });
  48. }));
  49. });
  50. }
  51. protected function getModel()
  52. {
  53. return new class() extends Model {
  54. protected $routes;
  55. protected $where = [];
  56. public function setRoutes($routes)
  57. {
  58. $this->routes = $routes;
  59. return $this;
  60. }
  61. public function where($column, $condition)
  62. {
  63. $this->where[$column] = trim($condition);
  64. return $this;
  65. }
  66. public function orderBy()
  67. {
  68. return $this;
  69. }
  70. public function get()
  71. {
  72. $this->routes = collect($this->routes)->filter(function ($route) {
  73. foreach ($this->where as $column => $condition) {
  74. if (!Str::contains($route[$column], $condition)) {
  75. return false;
  76. }
  77. }
  78. return true;
  79. })->all();
  80. $instance = $this->newModelInstance();
  81. return $instance->newCollection(array_map(function ($item) use ($instance) {
  82. return $instance->newFromBuilder($item);
  83. }, $this->routes));
  84. }
  85. };
  86. }
  87. public function getRoutes()
  88. {
  89. $routes = app('router')->getRoutes();
  90. $routes = collect($routes)->map(function ($route) {
  91. return $this->getRouteInformation($route);
  92. })->all();
  93. if ($sort = request('_sort')) {
  94. $routes = $this->sortRoutes($sort, $routes);
  95. }
  96. return array_filter($routes);
  97. }
  98. /**
  99. * Get the route information for a given route.
  100. *
  101. * @param \Illuminate\Routing\Route $route
  102. *
  103. * @return array
  104. */
  105. protected function getRouteInformation(Route $route)
  106. {
  107. return [
  108. 'host' => $route->domain(),
  109. 'method' => $route->methods(),
  110. 'uri' => $route->uri(),
  111. 'name' => $route->getName(),
  112. 'action' => $route->getActionName(),
  113. 'middleware' => $this->getRouteMiddleware($route),
  114. ];
  115. }
  116. /**
  117. * Sort the routes by a given element.
  118. *
  119. * @param string $sort
  120. * @param array $routes
  121. *
  122. * @return array
  123. */
  124. protected function sortRoutes($sort, $routes)
  125. {
  126. return Arr::sort($routes, function ($route) use ($sort) {
  127. return $route[$sort];
  128. });
  129. }
  130. /**
  131. * Get before filters.
  132. *
  133. * @param \Illuminate\Routing\Route $route
  134. *
  135. * @return string
  136. */
  137. protected function getRouteMiddleware($route)
  138. {
  139. return collect($route->gatherMiddleware())->map(function ($middleware) {
  140. return $middleware instanceof \Closure ? 'Closure' : $middleware;
  141. });
  142. }
  143. }