getName()) { // Only include admin routes and ensure they're appropriate for navigation if (!Str::startsWith($name, 'admin.') || !self::shouldIncludeRoute($name, $route)) { continue; } // Get the section name (e.g., 'users' from 'admin.users.index') $segments = explode('.', $name); $group = $segments[1] ?? 'other'; $namedRoutes[$group][] = [ 'name' => $name, 'uri' => $route->uri(), 'methods' => $route->methods()[0] ?? '', // Usually GET for navigation ]; } } // Sort groups and routes alphabetically ksort($namedRoutes); foreach ($namedRoutes as &$routes) { usort($routes, function ($a, $b) { return strcmp($a['name'], $b['name']); }); } return $namedRoutes; } /** * Determine if a route should be included in the navigation options. * * @param string $routeName * @param \Illuminate\Routing\Route $route * @return bool */ private static function shouldIncludeRoute(string $routeName, $route): bool { // Only include index and show routes // Exclude CRUD operation routes that shouldn't be in navigation $excludedPatterns = [ '*.create', '*.store', '*.edit', '*.update', '*.destroy', '*.io', '*.columns', '*.tables', '*.api.*' ]; // Check if route matches any excluded pattern foreach ($excludedPatterns as $pattern) { if (Str::is($pattern, $routeName)) { return false; } } // Check for route parameters in URI $uri = $route->uri(); if (preg_match('/{.*}/', $uri)) { return false; } // Only allow GET routes for navigation if (!in_array('GET', $route->methods())) { return false; } return true; } }