2012-12-01 37 views
7

Tôi đang gặp sự cố khi nắm bắt cách thức thích hợp nhất để xử lý url RESTful.Xử lý URL của RESTful url

Tôi đang gặp url như thế này:

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

Nguyên:

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

Như bây giờ tôi đang sử dụng mod_rewrite:

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

Và sau đó tôi đang đánh đố cùng các yêu cầu trong index.php, như sau:

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

Tôi đã nhìn thấy một số tạo ra một GET truy vấn là một chuỗi như:

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

Sau đó, bạn có ví dụ sử dụng biểu thức thông thường để có được các giá trị ra khỏi các truy vấn-string?

Đây có phải là cách tiếp cận tốt hơn để xử lý các url này không? Ưu và nhược điểm của các phương pháp khác nhau này là gì? Có cách nào tốt hơn không?

+0

'' Đây là lý do tại sao tôi không thích các loại url này.Các parms vị trí như thế này không dễ làm việc như parms tên/giá trị. ''. –

Trả lời

6

Bạn có thể sử dụng một cách tiếp cận khác thay vì khớp với tất cả các tham số bằng cách sử dụng ghi đè apache bạn có thể khớp với đường dẫn yêu cầu đầy đủ trong PHP bằng cách sử dụng preg_match. Áp dụng cụm từ thông dụng PHP tất cả các thông số sẽ được chuyển vào mảng $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... 
     } 
    } 
} 

Cách tiếp cận này có nhiều lợi ích:

  • Bạn không cần phải viết lại cho mỗi dịch vụ REST bạn đang phát triển. Tôi thích viết lại, nhưng trong trường hợp này bạn cần rất nhiều tự do, và sử dụng viết lại, bạn cần phải thay đổi cấu hình Apache mỗi khi bạn triển khai/mantain một dịch vụ mới.
  • Bạn có thể có một lớp giao diện người dùng PHP duy nhất cho tất cả các yêu cầu gửi đến. Giao diện người gửi gửi tất cả các yêu cầu đến bộ điều khiển chính xác.
  • Bạn có thể áp dụng lặp lại một mảng biểu thức chính quy cho các yêu cầu đến và sau đó gọi đúng hàm hoặc bộ điều khiển lớp/phương pháp phù hợp với kết quả thành công
  • Khi cuối cùng bộ điều khiển được khởi tạo để xử lý yêu cầu, tại đây bạn có thể kiểm tra phương pháp hTTP được sử dụng vào yêu cầu http
+0

sẽ không u vẫn cần một ánh xạ trong htaccess để trỏ đến tập tin php điều khiển, hoặc làm thế nào là có dây lên? –

+1

@NickHumphrey Cho rằng mọi yêu cầu có thể được xử lý bởi index.php (tệp mặc định trong 'DirectoryIndex'), thực sự bạn không cần ánh xạ bất cứ thứ gì vào' .htaccess '. Vâng ... máy chủ web của bạn nên ít nhất có thể thực thi các trang php. Vì vậy, tất cả những gì bạn phải làm là nhúng mã này bên trong tệp index.php và gửi yêu cầu tới trình xử lý chính xác. – freedev

3

nhập .htaccess này sẽ gửi tất cả mọi thứ ngoại trừ các file đang tồn tại để index.php:

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

Sau đó, bạn có thể làm một cái gì đó như thế này để chuyển đổi các url vào một mảng:

$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 

Sau đó, bạn có thể sử dụng một công tắc 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; 

} 

Đó là điều tôi thường làm cách nào.

Các vấn đề liên quan