header(trans('admin.routes'))->description(trans('admin.list'));
$content->body(function (Row $row) {
$colors = [
'GET' => 'primary',
'HEAD' => 'gray',
'POST' => 'green',
'PUT' => 'yellow',
'DELETE' => 'red',
'PATCH' => 'purple',
'OPTIONS'=> 'blue',
];
$grid = new Grid;
$grid->model()->setData(function (Grid\Model $model) {
return $this->getModel()->setRoutes($this->getRoutes())->get($model);
});
$grid->number();
$grid->method(trans('admin.method'))->map(function ($method) use ($colors) {
return "$method";
})->implode(' ');
$grid->uri(trans('admin.uri'))->sortable()->display(function ($v) {
return "$v
";
});
$grid->name(trans('admin.alias'))->bold();
$grid->action(trans('admin.route_action'))->display(function ($uri) {
if ($uri === 'Closure') {
return "$uri";
}
return preg_replace('/@.+/', '$0
', $uri);
});
$grid->middleware(trans('admin.middleware'))->badge('gray');
$grid->disablePagination();
$grid->disableRowSelector();
$grid->disableActions();
$grid->disableCreateButton();
$grid->disableExporter();
$grid->disableQuickCreateButton();
$grid->filter(function (Grid\Filter $filter) use ($colors) {
$values = array_keys($colors);
$filter->equal('method', trans('admin.method'))->select(array_combine($values, $values));
$filter->equal('uri', trans('admin.uri'));
$filter->equal('action', trans('admin.route_action'));
});
$row->column(12, $grid);
});
return $content;
}
protected function getModel()
{
return new class() {
protected $routes;
protected $where = [];
public function setRoutes($routes)
{
$this->routes = $routes;
return $this;
}
public function where($column, $condition)
{
$this->where[$column] = trim($condition);
return $this;
}
public function orderBy()
{
return $this;
}
public function get(Grid\Model $model)
{
$model->getQueries()->unique()->each(function ($query) use (&$eloquent) {
if ($query['method'] == 'paginate' || $query['method'] == 'get') {
return;
}
call_user_func_array([$this, $query['method']], $query['arguments'] ?? []);
});
return $this->routes = collect($this->routes)->filter(function ($route) {
foreach ($this->where as $column => $condition) {
if (is_array($route[$column])) {
if (!in_array($condition, $route[$column])) {
return false;
}
} elseif (!Str::contains(strtolower($route[$column]), strtolower($condition))) {
return false;
}
}
return true;
});
}
};
}
public function getRoutes()
{
$routes = collect(\Route::getRoutes())->map(function ($route) {
return $this->getRouteInformation($route);
})->all();
if ($sort = request('_sort')) {
$routes = $this->sortRoutes($sort, $routes);
}
return array_filter($routes);
}
/**
* Get the route information for a given route.
*
* @param \Illuminate\Routing\Route $route
*
* @return array
*/
protected function getRouteInformation(Route $route)
{
try {
return [
'host' => $route->domain(),
'method' => $route->methods(),
'uri' => $route->uri(),
'name' => $route->getName(),
'action' => $route->getActionName(),
'middleware' => $this->getRouteMiddleware($route),
];
} catch (\Exception $e) {
return [
'host' => $route->domain(),
'method' => $route->methods(),
'uri' => $route->uri(),
'name' => $route->getName(),
'action' => 'Undefined',
'middleware' => $this->getRouteMiddleware($route),
];
}
}
/**
* Sort the routes by a given element.
*
* @param string $sort
* @param array $routes
*
* @return array
*/
protected function sortRoutes($sort, $routes)
{
return Arr::sort($routes, function ($route) use ($sort) {
$column = $sort['column'];
$type = $sort['type'];
return $type === 'asc' ? !$route[$column] : $route[$column];
});
}
/**
* Get before filters.
*
* @param \Illuminate\Routing\Route $route
*
* @return string
*/
protected function getRouteMiddleware($route)
{
return collect($route->gatherMiddleware())->map(function ($middleware) {
return $middleware instanceof \Closure ? 'Closure' : $middleware;
});
}
}