2016-09-11 4 views
0

나는 아주 간단한 질문을 가지고 있습니다. 나는 RESTfull API를 만들기 위해 Slim 3을 사용하고 있습니다. 이 와서 어떻게 URL의 선택적 매개 변수 - Slim 3

작동 :

$app->get('/news[/{params:.*}]', function ($request, $response, $args) { 
    $params = explode('/', $request->getAttribute('params')); 
    $response->write("news!"); 
    return $response; 

}); 

하지만이 :

$app->get('/news[/{params:.*}]/details', function ($request, $response, $args) { 
$params = explode('/', $request->getAttribute('params')); 
     $response->write("news details"); 
     return $response; 

}); 

을, 후자는 컴파일되지 않습니다 사실.

+0

당신이 경로에 원하는 경로의 예를 추가 할 수 있습니다 : 그것은 이전에 비 충돌 경기에 루트 그룹에서 그들을 둘러싸는 경로 정규식 &으로 경로를 정의하여 해결할 수있다? – Baumi

답변

3

무제한Optional segments을 사용하면 각 결과 세그먼트가 예약됨을 의미합니다. /news[/{params:.*}]에 대한 정의 된 경로에

는 다음 경로 자격 :

/news 
/news/foo 
/news/foo/bar 
/news/foo/bar/... 

그래서 당신은 대괄호 후를 추가하는 경우 작동하지 않습니다 여분의 고정 세그먼트 /details를 추가.

당신은 세부 사항에 대한 작업을 수행하는 대괄호 내의 /details 세그먼트와 /news[/{params:.*}/details]로 정의 있지만 & 휴식 할 첫 번째 경로와 함께합니다. 당신은 여전히 ​​귀하의 첫 번째 경로로 & 체크 마지막 PARAM을 이동하거나 수 내에서 선택 PARAM과 :

$app->get('/news[/{params:.*}[/details]]', function ($request, $response, $args) { 

    $params = explode('/', $request->getAttribute('params')); 

    if (end($params) != 'details') { 

     $response->write("news!"); 

    } else { 

     // $params for details; 
     array_pop($params); 

     $response->write("news details"); 
    } 

    // $params is an array of all the optional segments 
    var_dump($params); 

}); 

업데이트 :

실제 문제는 여기에 경로에 충돌하는 정의처럼 보인다 예를 들어, 무제한의 선택 세그먼트는 항상 두 번째로 정의 된 경로와 일치합니다.

$app->group('/news', function() { 

    $this->map(['GET'], '', function ($request, $response, $args) { 

     $response->write("news w/o params"); 

    })->setName('news'); 

    // Unlimited optional parameters not ending with "/details" 
    $this->get('/{params:[[:alnum:]\/]*[^\/details]}', function ($request, $response, $args) { 
     $params = explode('/', $request->getAttribute('params')); 

     var_dump($params); 

     $response->write("news!"); 
    }); 

    // Unlimited optional parameters ending with "/details" 
    $this->get('/{params:[[:alnum:]\/]*\/details}', function ($request, $response, $args) { 
     $params = explode('/', $request->getAttribute('params')); 
     array_pop($params); // fix $params 

     var_dump($params); 

     $response->write("news details"); 
    }); 

}); 
+1

나는 /news//{params:.*}]/details와 /news[/{params:.*} 사이를 구분할 무언가가 필요합니다. 나는 항상 /news/details[/{params:.*}로 작성할 수 있지만, 더 이상 설명이 필요하지 않을 것입니다 ... –

+0

나는 대답을 업데이트했지만 실제로는 첫 번째 경로가 두 경로 모두를 준수합니다. 마지막 부분 인 "/ details"는 첫 번째 경로와 일치합니다. –

+0

이것을 시도 했습니까? –