You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Slim4中浏览器提交PUT/DELETE请求不被识别问题求助

Slim 4 方法覆盖不生效修复方案

你使用ARC插件可以正常访问的原因是ARC直接发送原生PUT/DELETE请求,不需要通过POST参数覆盖请求方法,因此可以直接匹配到对应路由。浏览器表单仅支持GET/POST原生方法,需要依赖方法覆盖中间件改写请求后才能匹配PUT/DELETE路由。

错误1:中间件加载顺序错误

Slim 4 中间件遵循后进先出的执行规则,最后注册的中间件最先执行。你当前将MethodOverrideMiddleware注册在RoutingMiddleware之后,会导致路由匹配逻辑先执行,此时请求方法还未被改写,自然无法匹配到PUT/DELETE路由。
正确的注册顺序要求:

  • 最先加载BodyParsingMiddleware(方法覆盖需要读取解析后的POST参数)
  • 再加载MethodOverrideMiddleware(完成请求方法改写)
  • 最后加载RoutingMiddleware(使用改写后的请求方法匹配路由)

错误2:表单参数名大小写不匹配

Slim 4 的MethodOverrideMiddleware默认读取的方法覆盖参数名为小写的_method,你表单中使用的是大写的_METHOD,框架无法识别到覆盖参数,因此不会改写请求方法。


修正后代码

middleware.php

use Slim\App;
use Slim\Middleware\ErrorMiddleware;
use Slim\Views\TwigMiddleware;
use Slim\Middleware\MethodOverrideMiddleware;

return function (App $app) {
    $app->addBodyParsingMiddleware();

    // 方法覆盖中间件放在路由中间件之前注册
    $app->add(new MethodOverrideMiddleware());

    $app->add(TwigMiddleware::class);
    
    $app->addRoutingMiddleware();

    $app->add(ErrorMiddleware::class);
};

表单代码

<form action="/dashboard" method="post">
    <input type="hidden" name="_method" value="PUT"/>
    <button type="submit">Send PUT request</button>
</form>
<form action="/dashboard" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
    <button type="submit">Send DELETE request</button>
</form>

可选配置(保留大写参数名)

如果你不想修改表单内的参数名,可以自定义方法覆盖中间件的参数键:

$methodOverride = new MethodOverrideMiddleware();
$methodOverride->setParameter('_METHOD');
$app->add($methodOverride);

内容的提问来源于stack exchange,提问作者Kuba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:45:09