2012-08-27 90 views
6

我想了解REST的基礎知識,我發現一個很好的教程(至少它幫助我瞭解基礎知識)。 This is the tutorial I've been followingREST的基礎知識與PHP

無論如何,在這段代碼片段中,作者展示了一個網站如何使用諸如www.example.com/restaurant/42 instead of /?restaurant_ID=42之類的東西的基礎知識。

任何人都可以解釋爲什麼這是用來

explode("/", $path, 2); 
instead of 
explode("/", $path); 

在這個例子中,他們會產生相同的陣列,但如果它是作爲Restaurant/item/3較長的路徑這樣?你不想分開一切嗎?正如你所看到的,進一步在這個塊中它們確實使用了爆炸而沒有定義限制。是第一個簡單的資源? (我猜的控制器,如果它是一個MVC)

<?php 
// assume autoloader available and configured 
$path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); 
$path = trim($path, "/"); 
@list($resource, $params) = explode("/", $path, 2); //why is limit used here? 

$resource = ucfirst(strtolower($resource)); 
$method = strtolower($_SERVER["REQUEST_METHOD"]); 
$params = !empty($params) ? explode("/", $params) : array(); //no limit here? 

if (class_exists($resource)) { 
try { 
    $resource = new $resource($params); 
    $resource->{$method}(); 
} 
catch (Exception $e) { 
    header("HTTP/1.1 500 Internal Server Error"); 
} 
} 
else { 
header("HTTP/1.1 404 File Not Found"); 
} 

回答

6

它的第一個分裂的整個路徑爲資源PARAMS變量。 $resource將包含第一個元素,其餘爲$params。例如:

restaurant/42  -> restaurant, 42 
restaurant/item/3 -> restaurant, item/3 
foo/bar/baz/boom -> foo, bar/baz/boom 

然後,$params字符串被進一步細分爲各個項目:

restaurant/42  -> restaurant, (42) 
restaurant/item/3 -> restaurant, (item, 3) 
foo/bar/baz/boom -> foo, (bar, baz, boom) 

基本上就是治療的第一部分特殊。

你可以得到同樣的效果這一點:

$params = explode('/', $path); 
$resource = array_shift($params); 
+1

+1不僅清楚地表示原來的代碼,但顯示達到相同的簡單的方法。 –

+0

我明白爆炸正在做什麼(至於它如何分離),我只是想知道爲什麼你想要使用限制而不是完全分開路徑(通過不指定限制)?在這個例子中,當使用爆炸時,我們是否只需要資源,限制爲2?無論哪種方式,我們不能只是調用$ array [0]來獲取資源?謝謝 – user1104854

+2

@user正如我所說,有*更容易的方法來做到這一點。但是你的代碼的作者的方式也是有效的。他只是想着不同的問題,並用不同的方法來解決問題。或者,也許他認爲這種方式讓他想要做的事情變得更好,這使得代碼更具可讀性。沒有其他原因。 – deceze