Laravel9提交DELETE删除表单未触发控制器方法问题解析
这个问题和Laravel框架逻辑无关,纯HTML语法违规导致的提交异常,核心是**<form>标签嵌套违反HTML标准**。
HTML规范严格禁止表单嵌套,如果你写的删除表单本身被另一个未闭合、或者主动包裹它的外层form套在里面,浏览器渲染DOM的时候会直接把内层嵌套的form标签整个忽略。这时候点删除按钮,触发的是外层表单的提交逻辑:默认用当前页面URL作为提交地址、用GET方法传参,所以你会看到_token、_method=DELETE、search=这些参数全被拼到URL的query串里,请求根本没发到你在action里写的/waifus/{id}地址,自然进不了控制器的dd()断点。
你加空form能解决问题,本质是撞对了DOM解析逻辑:从URL带search=参数能看出来,你页面里列表顶部的搜索表单漏写了</form>闭合标签,这个漏闭合的表单会把后面所有内容都算成自己的内部内容,直到遇到第一个</form>标签才会结束。你加的空form刚好带了闭合标签,直接把外层漏闭合的表单给提前终止了,后面的删除表单就成了平级的独立合法表单,浏览器能正常识别它的action和method配置,按要求发POST请求,自然就能匹配到你定义的DELETE路由,进控制器执行逻辑。
不要用加空form的临时方案,直接去模板里找漏写闭合标签的外层表单(就是顶部的搜索表单),补上对应的</form>,保证页面上所有form都是平级、互不嵌套的合法结构就行。
排查的时候可以直接在浏览器右键「查看网页源代码」,数一下<form>开标签和</form>闭标签的数量是否一一对应,很快就能定位到漏写闭合的位置。
顺便提一句,你现在写的删除表单CSRF伪造、HTTP方法伪装、路由模型绑定、控制器删除逻辑的写法全是对的,不用改这部分代码。
内容的提问来源于stack exchange,提问作者Rostrek

