Skip to content

Instantly share code, notes, and snippets.

@kmuenkel
Created January 16, 2022 08:08
Show Gist options
  • Save kmuenkel/21fca746022c19f7bff7b1de940db45e to your computer and use it in GitHub Desktop.
Save kmuenkel/21fca746022c19f7bff7b1de940db45e to your computer and use it in GitHub Desktop.
CI4 get route by name
<?php
/**
* @param string $name
* @param array $params
* @return string
*/
function routeByName(string $name, array $params = []): string
{
if (!static::$routesByName) {
$verbs = ['get', 'put', 'post', 'patch', 'delete'];
$getRoutes = fn(string $verb): array => array_keys(AppServices::routes()->getRoutes($verb));
$routesByVerb = array_combine($verbs, array_map($getRoutes, $verbs));
$getRouteVerb = fn(array $routes, string $verb): array => array_fill_keys($routes, $verb);
$routeVerbPairGrouped = array_map($getRouteVerb, $routesByVerb, $verbs);
$routesVerbPairs = array_merge(...$routeVerbPairGrouped);
$getRouteDetails = fn(string $verb, string $from): array
=> AppServices::routes()->getRoutesOptions($from, $verb) + compact('from');
$routeDetails = array_map($getRouteDetails, $routesVerbPairs, array_keys($routesVerbPairs));
$routesByName = array_column($routeDetails, 'from', 'as');
$url = strpos($url = $_SERVER['HTTP_HOST'], 'http') !== 0 ? 'http://'.$url : $url;
$parts = parse_url($url);
$prependDomain = fn(string $route) => $parts['scheme'].'://'.$parts['host']."/$route";
static::$routesByName = array_map($prependDomain, $routesByName);
}
if (!($route = static::$routesByName[$name] ?? null)) {
throw new UnexpectedValueException("No route definition for route name '$name'.");
}
while (preg_match('/\(.+?\)/', $route)) {
$route = preg_replace('/\(.+?\)/', (string)array_shift($params), $route, 1);
}
return $params ? $route.'?'.http_build_query($params) : $route;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment