2015-01-03 2 views
3

Я пытаюсь получить список всех маршрутов, содержащихся в app/Config/routes.php, и показать их на странице администратора. Я могу получить list of controllers с помощью $controllers = App::objects('controller');, и мне было интересно, можно ли сделать то же самое для маршрутов.Как я могу получить список всех маршрутов CakePHP?

Я попытался использовать подстроки в соответствии с приведенным ниже кодом, но проблемы, которые приходят на ум, прокомментировали маршруты, пробелы и варианты маршрутов, например. ссылки на внешние ресурсы. Я сейчас рассматриваю использование токенизатора 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); 
    } 
} 
+3

[** 'Router :: $ routes' **] (http://api.cakephp.org/2.5/class- Router.html # $ routes) – ndm

+0

Большое спасибо @ndm, это именно то, что я искал. Я хотел бы отметить ваш комментарий как ответ, если это возможно. – danialk

+0

Комментарии не принимаются как ответы, только фактические ответы могут. Обратите внимание, что вы также можете ответить на вопрос самостоятельно и принять его позже. – ndm

ответ

4

Благодаря @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) "/" 
} 
Смежные вопросы