【发布时间】:2021-10-31 18:21:14
【问题描述】:
所以一些背景知识 - 我决定将一个旧的 PHP MVC 项目拆分为一个 React 前端和 php 后端“服务器”。对于开发 - 两者都在本地托管,两者都配置在不同的 apache 根目录上,并在 /etc/hosts 中添加了一些虚拟主机 (api.loc/exp.loc)。 所谓的“API 服务器”使用 MVC 路由,它获取请求 /foo/bar 并启动 FooController->barAction()。
对于 API,我首先通过 fetch API 发送 POST 请求,然后通过 axios,两者都失败了,我发现(使用 xDebug 并打印 $_POST 作为响应),PHP 没有收到 $_POST。无 - 空数组。 我尝试使用 RESTClient 插件为 firefox 触发 POST 请求到“服务器”,我得到了相同的结果。
为了解决这个问题,经过一些研究,我在 index.php 文件中添加了以下标头,但老实说,我并不能 100% 确定它们的确切作用。
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json');
玩这些几乎没有任何区别。 这就是路由的完成方式(index.php):
$router = new Core\Router();
$url = $_SERVER['REQUEST_URI'];
$router->dispatch($url);
路由器.php
public function dispatch($url)
{
$route = $this->extractRoute($url);
$controller = 'Application\Controllers\\' . $this->convertToStudlyCaps($route['controller']);
$action = $this->convertToCamelCase($route['action']);
$params = $route['params'];
$params = count($params) > 0 ? $this->processParams($route['params']) : null;
if (class_exists($controller)) {
$Controller = new $controller();
$callableAction = $action.'Action';
if (is_callable([$Controller, $callableAction])) {
$Controller->$callableAction($params);
} else {
echo json_encode("Invalid method [ {$action} ] specified");
}
} else {
echo json_encode("Invalid controller specified: [ {$controller} ]");
}
}
public function extractRoute($url)
{
$urlArray = explode('/', $url);
$result = [];
$result['controller'] = (array_key_exists(1, $urlArray) && $urlArray[1] !== '') ? $urlArray[1] : 'Index';
$result['action'] = (array_key_exists(2, $urlArray) && $urlArray[2] !== '') ? $urlArray[2] : 'index';
$result['params'] = array_slice($urlArray, 3);
return $result;
}
请求到达控制器,但如上所述 - 没有可用的 $_POST。 $_GET 只接收'url' => '{urlpath}',不管我是否使用$_GET。
我已经检查了 php.ini post_max_size = 8M
所以经过一番搜索 - 我找到了一个解决方法,我可以使用 $_POST 数据提取
$data = file_get_contents('php://input');
我真正需要帮助的是了解原因。我不明白为什么没有 $_POST。我显然缺乏对确切问题的了解,如果有人能指出我正确的方向,我将不胜感激。 提前谢谢!
【问题讨论】:
-
您添加的标头用于 response 问题在于 request 发送与 PHP POST 方法不兼容的
Content-Type标头,这就是它的原因仅在php://input中找到