2016-11-09 4 views
1

Slim 프레임 워크에 정의 된 경로에서 동적 드롭 다운 메뉴를 작성하려고합니다. 여기에 제 질문이 있습니다. 일종의 배열에서 정의 된 모든 정적 경로에 액세스하는 방법이 있습니까?슬림 3 PHP 프레임 워크에서 모든 경로에 액세스하는 방법?

예를 들어,이 같은 내 경로를 정의하는 경우 :

// Index page: '/' 
require_once('pages/main.php'); 

// Example page: '/hello' 
require_once('pages/hello.php'); 

// Example page: '/hello/world' 
require_once('pages/hello/world.php'); 

// Contact page: '/contact' 
require_once('pages/contact.php'); 

각 파일이

// Index page 
$app->get('/', function ($request, $response, $args) { 

    // Some code 

})->setName('index'); 

내가에서 이러한 정의 경로의 모든 접근하고 싶습니다과 같은 별도의 페이지입니다 일종의 배열을 만든 다음 그 배열을 사용하여 템플릿 파일에서 정렬되지 않은 HTML 목록을 만듭니다.

<ul> 
    <li><a href="/">Index</a></li> 
    <li><a href="/hello">Hello</a> 
    <ul> 
     <li><a href="/hello/world">World</a></li> 
    </ul> 
    </li> 
    <li><a href="/contact">Contact</a></li> 
</ul> 

정의 된 경로를 변경할 때마다이 메뉴를 변경하고 싶습니다. 이것을 달성 할 수있는 방법이 있습니까?

답변

5

Router class in GitHub project for Slim의 빠른 검색은 경로 객체의 $this->routes[] 배열을 반환하는 public 메서드 getRoutes()을 보여줍니다. 경로 객체에서 당신이 getPattern() 방법을 사용하여 경로 패턴을 얻을 수 있습니다 :

$routes = $app->getContainer()->router->getRoutes(); 
// And then iterate over $routes 

foreach ($routes as $route) { 
    echo $route->getPattern(), "<br>"; 
} 

편집을 추가했습니다 예를

+0

하지만'Route' [objects] (https://github.com/slimphp/Slim/blob/3.x/Slim/Route.php)의 무리를 반환합니다. 이것은 아마도 OP가 필요로하지 않는 것일 것입니다 . –

+1

@GeorgyIvanov 예. 그러나 배열을 반복하면서 인쇄 할 각 객체의 속성을 선택할 수 있습니다. – Wolf

+0

이것은 내가 원하는대로 작동하는 것 같습니다. 감사합니다 늑대! 나는 모든 페이지가'require_once'로로드 된 후 PHP 파일에'$ container [ 'allRoutes'] = $ app-> getContainer() -> router-> getRoutes();를 넣고 사용하도록했습니다 '$ routes = $ this-> allRoutes; '페이지에서. 이 접근법은 괜찮습니까? –

2

예. Slim에 name your routes 수 있습니다. 이것은 매우 간단한 방식으로 이루어집니다 : 너무 자리에

$url = $app->getContainer()->get('router')->pathFor('helloPage'); 
echo $url; // Outputs '/hello' 

당신은 이름을 지정할 수 있습니다 경로 :

$app->get('/hello', function($request, $response) { 
    // Processing request... 
})->setName('helloPage'); // setting unique name for route 

지금이 같은 이름으로 URL을 얻을 수 있습니다

// Let's define route with placeholder 
$app->get('/user-profile/{userId:[0-9]+}', function($request, $response) { 
    // Processing request... 
})->setName('userProfilePage'); 

// Now get the url. Note that we're passing an array with placeholder and its value to `pathFor` 
$url = $app->getContainer()->get('router')->pathFor('helloPage', ['userId': 123]); 
echo $url; // Outputs '/user-profile/123' 

이를 템플릿에서 이름을 기준으로 경로를 참조하는 경우 URL을 변경해야 할 경우 경로 한정에서만 수행해야하므로 이동 방법은 확실합니다. 나는 이것을 특히 시원하게 느낀다.

0

늑대의 답변에 따라, 나는 내 솔루션을 만들었습니다.

경로를 정의하는 페이지에서 모든 경로 아래에 정의 된 경로가있는 컨테이너가 만들어집니다.

// Get ALL routes 
// -------------- 
$allRoutes = []; 
$routes = $app->getContainer()->router->getRoutes(); 

foreach ($routes as $route) { 
    array_push($allRoutes, $route->getPattern()); 
} 

$container['allRoutes'] = $allRoutes; 

이렇게하면 나중에 프로젝트에서 사용할 수있는 필요한 경로가있는 배열이 만들어집니다. 정의 된 경로 내에서

다음

,이 같은이를 호출 할 수

$app->get('/helloWorld', function ($request, $response, $args) { 

    print_r ($this->allRoutes); 

})->setName('helloWorld'); 

이 의지

Array 
(
    [0] =>/
    [1] => /helloWorld 
    [2] => /someOtherRoute 
    ... 
) 

그래서 우리는 우리가 원하는대로 만들려면이 배열을 사용할 수있는 출력. 다시 한번 감사 드려요 늑대!

+0

자리 표시 자와 함께 사용할 수 있습니까? –

+1

그렇지 않습니다. 정적 라우트 만. –

+0

또한'$ route-> getMethods()'의 데이터를 가져 와서 그 경로가'GET' /'POST'인지 여부를 알 수 있습니다. – user3791372

관련 문제