Laravel 6资源路由传递双参数失败,update方法提示参数不足
问题分析
Laravel 默认的资源路由update仅设计接受单个资源ID参数,你试图在控制器方法中直接添加第二个参数,但路由并未定义该参数,因此Laravel无法自动传递第二个参数,导致报错。同时你的表单代码存在多余参数,需要修正。
解决方案
方案1:通过请求体获取coupon_code(推荐,符合REST规范)
coupon_code属于表单提交的业务参数,而非资源标识符(subscription ID)的一部分,通过请求体获取是更合理的方式:
修正控制器代码
移除第二个参数,通过Request对象获取表单提交的coupon_code:use Illuminate\Http\Request; public function update(Request $request, $id) { // 获取表单提交的优惠券码 $coupon_code = $request->input('coupon_code'); dd($coupon_code); // 现在可正常执行 // 后续业务逻辑... }修正视图表单代码
去掉路由参数中的$coupon_code,同时删除Form::open中多余的第三个参数$coupon_code:{{ Form::open(['route' => ['admin.subscriptions.update', $plan->id], 'method' => 'PUT', 'id' => 'role-' . $plan->id]) }} Coupon Code: <input type="text" name="coupon_code" value="{{ $coupon_code ?? '' }}"> {{ Form::close() }}(若需要回显已有优惠券码,添加
value="{{ $coupon_code ?? '' }}"即可)保留原资源路由
无需修改路由配置,原Route::resource('subscriptions', 'Admin\SubscriptionsController')可正常工作。
方案2:自定义路由支持两个参数(不推荐,不符合REST规范)
若你坚持通过路由传递两个参数,需覆盖默认的update路由:
修改路由文件
在原资源路由之前,定义支持双参数的update路由,并排除默认的update方法:// 自定义update路由,接受subscription ID和coupon_code两个参数 Route::put('subscriptions/{subscription}/{coupon_code}', 'Admin\SubscriptionsController@update')->name('subscriptions.update'); // 定义资源路由,排除已自定义的update方法 Route::resource('subscriptions', 'Admin\SubscriptionsController')->except(['update']);修正控制器代码
保持原方法定义,注意参数顺序需与路由占位符一致:public function update($id, $coupon_code) { dd($coupon_code); // 后续业务逻辑... }修正视图表单代码
删除Form::open中多余的第三个参数$coupon_code:{{ Form::open(['route' => ['admin.subscriptions.update', $plan->id, $coupon_code], 'method' => 'PUT', 'id' => 'role-' . $plan->id]) }} Coupon Code: <input type="text" name="coupon_code"> {{ Form::close() }}
内容的提问来源于stack exchange,提问作者Hondaman900
相关产品推荐
相关产品推荐

