Laravel测试Get路由提示token必填,求排查语法问题
Laravel测试Get路由时「token字段为必填项」问题排查
问题描述
在Laravel中测试Get路由时,收到「token字段为必填项」的错误提示。
路由定义如下:
Route::get('/auth/resendsms/{token}', [AuthController::class, 'resendsms'])->name('resendsms');
测试时使用了两种写法:
$response = $this->get(route('resendsms', ['token' => $token]));
$response = $this->get(route('resendsms',$token));
问题原因及解决方法
你提供的两种路由生成语法本身没有错误,问题大概率出在以下环节:
1. CSRF验证拦截
Laravel的Web路由默认启用VerifyCsrfToken中间件,部分场景下(比如自定义中间件配置)GET请求也会被拦截,导致错误提示混淆。
解决:
- 在测试类的
setUp方法中添加代码临时关闭CSRF验证:$this->withoutMiddleware(\App\Http\Middleware\VerifyCsrfToken::class); - 或者在
app/Http/Middleware/VerifyCsrfToken.php的except数组中添加该路由:protected $except = [ '/auth/resendsms/*', ];
2. 控制器方法的参数校验逻辑错误
检查AuthController的resendsms方法,是否错误地将token作为请求参数(Query/Body)校验,而非路由参数:
错误示例:
public function resendsms(Request $request) { $request->validate([ 'token' => 'required' ]); // 逻辑代码 }
正确写法:直接从路由参数接收token,无需从Request中获取:
public function resendsms(Request $request, string $token) { // 直接使用$token变量 // 若需校验,可直接判断$token是否为空 if(empty($token)) { return response()->json(['message' => 'token字段为必填项'], 400); } // 逻辑代码 }
3. 路由参数与控制器参数名不匹配
确保路由定义中的{token}和控制器方法接收的参数名称完全一致,比如控制器方法参数如果写为$smsToken,会导致无法正确获取路由参数,进而触发必填校验。
内容的提问来源于stack exchange,提问作者VojtaN
相关产品推荐
相关产品推荐

