在PHP Master Write前沿代码中发现了一个错误?

时间:2014-07-06 11:22:40

标签: php apache .htaccess mod-rewrite

我正在阅读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}}事件而非事件

1 个答案:

答案 0 :(得分:1)

是的,这本书的作者似乎写了一个错字。对于网址ucfirst($request->url_elements[1]) . 'Controller';EventsController确实会评估为http://example.com/events