Slim框架中PUT请求替代getParsedBody的方法是什么?
解决Slim框架PUT请求无法使用getParsedBody的问题
我来帮你捋捋这个问题哈,你遇到的情况其实挺常见的——Slim框架默认对PUT请求的application/x-www-form-urlencoded格式数据不会自动解析,所以直接调用getParsedBody()拿不到内容,而你用parse_str($request->getBody()->getContents(), $icone)的方法是可行的,不过我们可以把这个过程优化得更规范些,或者让框架自动帮你解析。
为什么getParsedBody()不好用?
Slim的默认BodyParsingMiddleware主要针对POST请求的表单数据(application/x-www-form-urlencoded和multipart/form-data)做自动解析,但对于PUT请求的同类型数据,框架并没有默认配置解析规则,所以getParsedBody()自然返回空或者null。
方法一:优化你当前的手动解析方式
你现在的写法是有效的,但可以做两个小优化:
- 直接用路由参数
$args['id']获取ID,不用绕弯子去拿route属性 - 注意
getContents()会一次性读取请求体流,后续如果还要读取需要重置流位置
优化后的代码:
$app->put('/{id}', function($request, $response, $args) use ($app){ // 读取请求体内容 $bodyContent = $request->getBody()->getContents(); parse_str($bodyContent, $icone); // 如果之后需要再次读取请求体,记得重置流指针 // $request->getBody()->rewind(); // 直接从$args获取ID更简洁 $courseId = $args['id']; return $response->withJson($icone); });
方法二:配置中间件让框架自动解析PUT表单数据
如果不想每次都手动解析,可以给Slim添加自定义的请求体解析规则,让它自动处理PUT请求的application/x-www-form-urlencoded数据:
use Slim\Factory\AppFactory; use Slim\Middleware\BodyParsingMiddleware; // 创建App实例 $app = AppFactory::create(); // 配置BodyParsingMiddleware,添加PUT请求的表单数据解析器 $bodyParser = new BodyParsingMiddleware(); $bodyParser->addParser( 'application/x-www-form-urlencoded', function ($input) { parse_str($input, $data); return $data; } ); $app->add($bodyParser); // 之后的PUT路由就可以直接用getParsedBody()了 $app->put('/{id}', function($request, $response, $args){ // 直接获取解析后的请求体数据 $icone = $request->getParsedBody(); $courseId = $args['id']; return $response->withJson($icone); });
这样配置后,所有application/x-www-form-urlencoded格式的PUT请求,框架都会自动帮你解析,你就可以像用POST请求一样直接调用getParsedBody()拿到数据啦。
内容的提问来源于stack exchange,提问作者ace ofglad
相关产品推荐
相关产品推荐

