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
相关产品推荐
相关产品推荐

