6

我正在尝试学习 REST 的基础知识,并且找到了一个非常好的教程(至少它帮助我理解了基础知识)。这是我一直在关注的教程

无论如何,在这段代码片段中,作者展示了网站如何使用类似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");
}
4

1 回答 1

6

它首先将整个路径拆分为一个资源和一个参数变量。$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);
于 2012-08-27T12:51:53.727 回答