我正在阅读SitePoint的书 PHP Master Write Cutting-Edge Code ;在第119页(第3章,API)作者说:
对于示例URL http://example.com/events,$ controller_name的值变为EventController,因为它是GET请求,$ action_name是GETAction()。
代码是:
// initialize the request object and store the requested URL
$request = new Request();
$request->url_elements = array();
if(isset($_SERVER['PATH_INFO'])) {
$request->url_elements = explode('/', $_SERVER['PATH_INFO']);
}
// figure out the verb and grab the incoming data
$request->verb = $_SERVER['REQUEST_METHOD'];
switch($request->verb) {
case 'GET':
$request->parameters = $_GET;
break;
case 'POST':
case 'PUT':
$request->parameters = json_decode(file_get_contents➥ ('php://input'), 1);
break;
case 'DELETE':
default:
// we won't set any parameters in these cases
$request->parameters = array();
}
// route the request
if($request->url_elements) {
$controller_name = ucfirst($request->url_elements[1]) .➥ 'Controller';
if(class_exists($controller_name)) {
$controller = new $controller_name();
$action_name = ucfirst($request->verb) . "Action";
$response = $controller->$action_name($request);
} else {
header('HTTP/1.0 400 Bad Request');
$response = "Unknown Request for " . $request->url_elements[1];
}
} else {
header('HTTP/1.0 400 Bad Request');
$response = "Unknown Request";
}
他们在.htaccess文件中使用了RewriteRule
Apache mod_rewrite模块,以便所请求资源不存在的每个请求(不是文件而不是dir)都通过 index.php 脚本位于服务器的文档根目录:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
因此,http://example.com/events的请求会以example.com/index.php/events
作为PATH_INFO传递给/events
。
不是我想要看起来很挑剔,但EventController
不应该是EventsController
,因为他们会分割PATH_INFO变量并使用{em}的<{1}}事件而非事件?
答案 0 :(得分:1)
是的,这本书的作者似乎写了一个错字。对于网址ucfirst($request->url_elements[1]) . 'Controller';
,EventsController
确实会评估为http://example.com/events
。