我正在尝试学习REST的基础知识,我发现了一个非常好的教程(至少它帮助我理解了基础知识)。 This is the tutorial I've been following 。
无论如何,在此代码段中,作者展示了网站如何使用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");
}
答案 0 :(得分: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);