Как я могу получить список всех маршрутов CakePHP?
Я пытаюсь получить список всех маршрутов, содержащихся в app / Config / routes.php и показать их на странице администратора.
Я могу получить список контроллеров с помощью $controllers = App::objects('controller');
, и мне было интересно, можно ли сделать то же самое для маршрутов.
Я пробовал использовать подстроки в соответствии с приведенным ниже кодом, но проблемы, которые приходят на ум, - это закомментированные маршруты, пробелы и вариации маршрутов, например ссылки на внешние ресурсы. Сейчас я рассматриваю возможность использования токенизатора php, но я бы хотелось бы знать, есть ли простое и элегантное решение, встроенное в CakePHP.
$source = file_get_contents(APP . 'Config/routes.php');
$startPos = stripos($source, 'Router::connect(');
$routes = array();
while ($startPos !== false) {
$endPos = stripos($source, ';', $startPos + 15);
if($endPos !== false) {
$route = substr($source, $startPos, $endPos - $startPos);
$urlStart = stripos($route, "'");
if($urlStart !== false) {
$urlEnd = stripos($route, "'", $urlStart + 1);
$url = substr($route, $urlStart + 1, $urlEnd - $urlStart - 1);
$routes[] = array('route'=>$route, 'url'=>$url);
}
$startPos = stripos($source, 'Router::connect(', $endPos + 1);
}
}
1 ответ:
Спасибо @ndm за ответ, для всех, кто пытается получить список маршрутов, проанализированных маршрутизатором CakePHP (т. е. внутри приложения / Config / routes.php), а также те, которые используются для любых плагинов, используйте
Router::$routes
. Выход может быть объектом CakeRoute, объектом RedirectRoute или объектом PluginShortRoute в зависимости от вашего приложения.$routes = Router::$routes; echo('<pre>'); // Readable output var_dump($routes); echo('</pre>');
Например, маршрут для
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
показывает:object(CakeRoute)#16 (7) { ["keys"] => array(0) {} ["options"] => array(0) {} ["defaults"] => array(4) { ["controller"] => string(5) "pages" ["action"] => string(7) "display" [0] => string(4) "home" ["plugin"] => NULL } ["template"] => string(1) "/" }