1

我一直在尝试从thephpleague路由的精彩包的当前版本。

我有一个简单的索引页面来处理路由,它工作得很好。

<?php declare(strict_types=1);

use Laminas\Diactoros\ServerRequestFactory;
use Laminas\HttpHandlerRunner\Emitter\SapiEmitter;
use Laminas\Diactoros\ResponseFactory;
use League\Route\Router;
use League\Route\Strategy\JsonStrategy;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

$strategy = new JsonStrategy(new ResponseFactory());
$router = new Router;
$router->setStrategy($strategy);

$router->post(
    '/hello',
    function (ServerRequestInterface $request): ResponseInterface
    {
        var_dump($request->getParsedBody());
    }
);

$request = ServerRequestFactory::fromGlobals(
    $_SERVER,
    $_GET,
    $_POST,
    $_COOKIE,
    $_FILES
);
$response = $router->dispatch($request);

// send the response to the browser
(new SapiEmitter)->emit($response);

我的问题是当我发送一个POST包含数据的请求JSON时,我无法在我的代码中捕获它,如 line 所示var_dump($request->getParsedBody());

目前,我能够捕获随请求发送的数据的唯一方法是运行json_decode(file_get_contents('php://input'), true);.

我需要做什么才能获得随任何请求发送的有效负载,无论是GET, POST, PUT,PATCH还是其他?

谢谢你。

4

1 回答 1

1

我终于弄明白了。经过仔细检查,我认为使用依赖注入ServerRequestInterface映射到Laminas\Diactoros\ServerRequest.

所以,为了说明

$router->post(
    '/hello',
    function (ServerRequestInterface $request): ResponseInterface {
        var_dump(
            $request->getHeaders(),
            $request->getParsedBody(),
            $request->getQueryParams(),
            $request->getUploadedFiles(),
            $request->getBody()->getContents(),
            $request // Laminas\Diactoros\ServerRequest
        );
    }
);

在哪里

  1. $request->getHeaders()为您提供请求标头
  2. $request->getParsedBody()将在设置标头时返回所有数据作为发送的数组Content-Type: multipart/form-data(至少就我所做的实验而言)
  3. $request->getQueryParams()将所有查询字符串参数作为数组提供,就像$_GET
  4. $request->getUploadedFiles()将所有上传的文件作为一个实例数组Laminas\Diactoros\UploadedFile
  5. $request->getBody()->getContents()设置标头时,将作为字符串返回所有数据Content-Type: application/json。然后您可以运行json_decode($request->getBody()->getContents(), true)以获取数组的实际内容
于 2021-03-24T12:26:35.143 回答