Laravel 5.5中$request->input返回null,多语言板块创建存值问题
我来帮你一步步排查这个问题,毕竟在Laravel里拿不到请求参数大概率是表单或者路由配置的小问题,咱们逐个看:
确认表单字段的
name属性是否正确
你提到视图里有Form::open但只写了<legend>Nom du secteur...,这说明可能表单里的输入字段没有正确设置name属性!Laravel的$request->input()是通过字段的name来取值的,比如如果你的板块名称输入框是这样的:{!! Form::text('catname', old('catname'), ['class' => 'form-control']) !!}这里的第一个参数
'catname'就是关键,没有这个name,$request->input('catname')肯定返回null。如果是多语言版本,比如法语名称,你可能需要命名为catname_fr或者数组形式catname[fr],这样后端才能正确捕获。检查CSRF令牌是否正常生成
虽然你用了Form::open,它应该自动生成CSRF隐藏字段,但还是建议你打开页面源码,看看有没有类似这样的代码:<input type="hidden" name="_token" value="XXXXXX">如果没有的话,可能是
Form::open的配置有问题,或者你可以手动添加:{!! csrf_field() !!}没有CSRF令牌的话,Laravel会拒绝请求,这时候可能连请求都到不了控制器,或者参数被过滤掉。
验证路由和请求方法是否匹配
你的路由名称是setup.sectorCreate,请求方法是POST,去routes/web.php里确认路由定义是不是这样的:Route::post('/setup/sector-create', 'SetupController@sectorCreate')->name('setup.sectorCreate');如果路由写成了
Route::get,那POST请求会被Laravel拦截,导致参数无法正常传递。另外,也可以在控制器里先打印所有请求参数看看:public function sectorCreate(Request $request) { dd($request->all()); // 看看这里有没有你提交的字段 // 其他代码... }如果
dd出来的数组里没有你的表单字段,那肯定是表单的问题,不是后端的问题。检查浏览器发送的请求数据
打开浏览器的开发者工具(按F12),切换到Network标签,提交表单后找到对应的POST请求,查看Form Data部分,看看你输入的值是不是真的被发送了。如果这里没有,那就是前端表单的问题——比如字段被设置了disabled,或者没有正确嵌套在<form>标签里,或者输入框的name拼写错误。多语言字段的特殊处理
因为你是多语言表单,可能需要为每个语言单独设置字段,比如:@foreach($langs as $lang) <div class="form-group"> {!! Form::label("catname_{$lang->id}", "Nom du secteur ({$lang->langname_fr})") !!} {!! Form::text("catname_{$lang->id}", old("catname_{$lang->id}"), ['class' => 'form-control']) !!} </div> @endforeach然后在控制器里通过
$request->input("catname_{$lang->id}")来获取对应语言的名称,之后再把数据保存到category_lang中间表里。
按照这几个步骤排查,应该能找到问题所在——大部分情况都是表单字段的name没写对,或者路由方法不匹配导致的。
内容的提问来源于stack exchange,提问作者davidvera

