2016-09-14 2 views
0

'또는'경로에서 어떻게 할 수 있습니까?Slim 3 - 경로에서 or 연산자를 사용하는 방법?

예를 들어, /about/fr/about이 동일한 개체/클래스/메소드를 가리키고 있습니다. 그래서 대신 :

$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

은 이걸로 시도 :

Type: FastRoute\BadRouteException 
Message: Cannot use the same placeholder "url" twice 
File: /var/www/mysite/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php 

모든 아이디어를 어떤 방법이 문제를 해결하려면 :

$app->get('/{url:[a-zA-Z0-9\-]+}|/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

나는이 오류가?

또는 해결 방법 코드를 반복 하시겠습니까?

+0

마지막 경로 패턴에서 오류가 발생했습니다. url을 두 번 참조합니다 ... 동일한 토큰을 두 번 사용하지 않아도됩니다. – geggleto

+0

@geggleto 코드 반복을 피하는 해결책은 무엇입니까? – laukok

+0

코드를 중복시키지 않으려면 http://www.slimframework.com/docs/objects/router.html#container-resolution – danopz

답변

1

자리 표시의 순서를 변경하면 가능한 경우 ,이 방식을 구현할 수 있습니다 : "자리 표시의 순서를 변경"으로

$app->get('/{url:[a-zA-Z0-9\-]+}[/{language:[en|fr]+}]', function($request, $response, $args) { 
    // code here... 
}); 

이 말은 URL이 먼저, 그런 다음 언어는 fr/about 대신 about/fr을 사용합니다.

이 솔루션은 Slim's built-in optional segments을 사용합니다. "language"자리 표시자를 감싸는 대괄호에주의하십시오.

그러나 선택 세그먼트가 경로의 끝에 배치되어야합니다. 그렇지 않으면 FastRoute\BadRouteException이됩니다.

+0

좋은 아이디어! 감사. – laukok

2

시도한 것이 작동하지 않는 이유는 다음과 같습니다.

라우팅 :

$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

FastRoute은 첫 경기 및 파견을 찾습니다. 첫 번째 경로가 /about/fr/about 과 일치하므로 먼저 디스패치됩니다 ... 사실 항상 항상 우선 발송됩니다.

실제로 원하는 것은 경로 정의를 재정렬하는 것입니다.


$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 
// ADD OTHER ROUTES HERE 

// CATCH ALL 
$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

은 단순히 다른 토큰을 정의 ... URL을 중복 문제를 해결합니다.

$app->get('/{url:[a-zA-Z0-9\-]+}|/{language:[fr|en]+}/{url2:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 
+0

에 '/ {url : [a-zA-Z0-9 \ -] +} |/{language : [fr | en] +}/{url2 : [a-zA-Z0-9 \ -] +} ''나는 항상 404 페이지를 얻을 것입니다. – laukok

+0

저는 정말로 정규식 전문가가 아닙니다 ... : D 정확히 당신은 무엇을하려합니까? – geggleto

관련 문제