Laravel 5.6中Form::open出现无消息错误求助
问题分析与解决方案
你的问题核心出在请求方法不匹配,另外也帮你排查下其他可能的潜在问题,一步步来:
1. 路由与表单的请求方法冲突
你注册的路由是GET类型:
Route::get('msgs/send/{id}', ['as'=>'admin.msgs.send', 'uses'=>'MsgsController@send']);
但Form::open()默认会生成POST请求的表单,这就导致表单提交时,Laravel找不到对应POST方法的路由,从而抛出无消息的错误(本质是请求方法不允许的405错误)。
对应解决办法:
根据你的业务场景二选一:
- 场景1:路由是展示发送页面,表单提交到另一个处理路由(推荐,符合REST规范)
先新增一个POST路由处理表单提交:
然后修改表单指向这个POST路由:// 展示发送消息页面(GET) Route::get('msgs/send/{id}', ['as'=>'admin.msgs.send', 'uses'=>'MsgsController@showSendForm']); // 处理消息发送提交(POST) Route::post('msgs/send/{id}', ['as'=>'admin.msgs.send.submit', 'uses'=>'MsgsController@handleSend']);{!! Form::open(['route' => array('admin.msgs.send.submit', 'id'=>$user->id)]) !!} - 场景2:确实需要用GET提交表单(不推荐,敏感信息会暴露在URL中)
强制表单使用GET方法:{!! Form::open(['route' => array('admin.msgs.send', 'id'=>$user->id), 'method' => 'GET']) !!}
2. 确认LaravelCollective Form组件兼容性
Laravel 5.6对应的LaravelCollective Form版本是5.6.*,先检查composer.json里的依赖是否正确:
"require": { "laravelcollective/html": "5.6.*" }
如果不对,运行composer update更新依赖,同时确认config/app.php里已经注册了服务提供者和门面:
// 服务提供者 Collective\Html\HtmlServiceProvider::class, // 门面 'Form' => Collective\Html\FormFacade::class, 'Html' => Collective\Html\HtmlFacade::class,
3. POST请求的CSRF令牌验证
如果用POST提交表单,LaravelCollective的Form::open()默认会自动添加CSRF令牌,但如果你的表单没生成这个字段,手动加上:
{!! Form::token() !!}
或者用原生HTML写法:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
按上面的步骤调整后,应该就能解决你遇到的无消息错误了。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

