2012-12-01 3 views
7

RESTful URL을 처리하는 가장 적절한 방법이 무엇인지 파악하는 데 어려움을 겪고 있습니다.RESTful URL의 PHP 처리

http://localhost/products 
http://localhost/products/123 
http://localhost/products/123/color 

원래 :

RewriteRule ^([^/]*)([/])?([^/]*)?([/])?(.*)$ /index.php?handler=$1&productID=$3&additional=$5 [L,QSA] 

그리고 내가 수수께끼 해요 : 내가 mod_rewrite를 사용하고 지금으로

http://localhost/index.php?handler=products&productID=123&additional=color 

나는 URL의 이와 같은 봉착 함께 index.php에 요청을 :

그런 다음

if ($_GET['handler'] == 'products/123/color') 

는 쿼리 문자열에서 값을 얻기 위해 정규 표현식을 사용하는 예를 들어 당신을 :

if ($_GET['handler'] == 'products' && isset($_GET['productID'])) { 
    // get product by its id. 
} 

나는 어떤 하나의 문자열 등의 GET 쿼리를 만들어 본 적이 ?

이 URL을 처리하는 더 좋은 방법입니까? 이러한 다양한 접근 방식에 대한 장단점은 무엇입니까? 더 좋은 방법이 있습니까?

+0

''이 때문에 이러한 유형의 URL이 마음에 들지 않습니다.이와 같은 위치 매개 변수는 이름/값 매개 변수만큼 쉽게 작동하지 않습니다. ''. –

답변

6

preg_match를 사용하여 PHP에서 전체 요청 경로와 일치시킬 수있는 apache 재 작성을 사용하여 모든 매개 변수와 일치하는 대신 다른 접근 방식을 사용할 수 있습니다. PHP 정규식을 적용하면 모든 매개 변수가 $args 배열로 이동합니다.

$request_uri = @parse_url($_SERVER['REQUEST_URI']); 
$path = $request_uri['path']; 
$selectors = array(
    "@^/products/(?P<productId>[^/]+)|/[email protected]" => 
      (array("GET" => "getProductById", "DELETE" => "deleteProductById")) 
); 

foreach ($selectors as $regex => $funcs) { 
    if (preg_match($regex, $path, $args)) { 
     $method = $_SERVER['REQUEST_METHOD']; 
     if (isset($funcs[$method])) { 
      // here the request is handled and the correct method called. 
      echo "calling ".$funcs[$method]." for ".print_r($args); 
      $output = $funcs[$method]($args); 
      // handling the output... 
     } 
    } 
} 

이 방법은 많은 장점이 있습니다

  • 당신은 당신이 개발하고 각 REST 서비스에 대한 재 작성이 없습니다. 필자는 재 작성을 좋아하지만이 경우에는 많은 자유가 필요하며 재 작성을 사용하면 새로운 서비스를 배치/설치할 때마다 Apache 구성을 변경해야합니다.
  • 들어오는 모든 요청에 ​​대해 단일 PHP 프론트 엔드 클래스를 가질 수 있습니다. 프론트 엔드는 모든 요청을 올바른 컨트롤러로 전달합니다.
  • 들어오는 요청에 정규식 배열을 반복적으로 적용한 다음 일치에 따라 올바른 함수 또는 클래스 컨트롤러/메서드를 호출 할 수 있습니다.
  • 컨트롤러가 요청을 처리하도록 인스턴스화되면 여기에서 에

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . /index.php 
    

    는 그런 다음 URL을 변환하려면이 같은 작업을 수행 할 수 있습니다 : http 요청에 사용되는 HTTP 방법은

+0

컨트롤러 PHP 파일을 가리 키기 위해 htaccess에서 매핑이 여전히 필요하지 않거나 어떻게 유선입니까? –

+1

@NickHumphrey 모든 요구가 index.php ('DirectoryIndex'의 기본 파일)에 의해 처리 될 수 있다고 가정하면 실제로 어떤 것도'.htaccess'로 매핑 할 필요가 없습니다. 글쎄 ... 웹 서버는 최소한 PHP 페이지를 실행할 수 있어야합니다. 따라서이 코드를 index.php 파일에 삽입하고 올바른 핸들러에 요청을 보내면됩니다. – freedev

3

이 htaccess로 항목의 index.php에 존재하는 파일을 제외하고 모든 것을 보내드립니다 배열 :

$url_array = explode('/', $_SERVER['REQUEST_URI']); 
array_shift($url_array); // remove first value as it's empty 
array_pop($url_array); // remove last value as it's empty 

는 그런 다음 thusly 히 스위치를 사용할 수 있습니다 : 나는 일반적으로 어차피하는 일이다

switch ($url_array[0]) { 

    case 'products' : 
     // further products switch on url_array[1] if applicable 
     break; 

    case 'foo' : 
     // whatever 
     break; 

    default : 
     // home/login/etc 
     break; 

} 

.

관련 문제