Laravel API路由token中间件无响应问题排查求助
Laravel带Token前缀路由中间件无响应问题排查与解决
配置带{token}前缀的API路由,使用token_verify中间件做Token验证时,无效Token能正常返回401错误,但有效Token时接口无响应,日志显示路由参数正常。以下是相关代码及解决方案:
相关代码片段
api.php
Route::prefix('{token}')->middleware('token_verify')->group(function () { Route::prefix('services')->group(function () { Route::get("get/{id?}", [ServisController::class, 'getServices']); Route::post("set", [ServisController::class, 'setServices']); Route::delete("delete/{id}", [ServisController::class, 'deleteServices']); }); });
Kernel.php
protected $middlewareGroups = [ 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\TokenMiddleware::class, ], ]; protected $routeMiddleware = [ 'token_verify' => \App\Http\Middleware\TokenMiddleware::class, // 其他中间件... ];
TokenMiddleware.php
public function __construct(TokenService $tokenService) { $this->tokenService = $tokenService; } public function handle(Request $request, Closure $next) { $token = $request->route('token'); if ($this->tokenService->validToken($token) === false) { return new Response(['error' => 'Invalid token'], 401); } Log::error("next",["next" => $request->route()]); return $next($request); }
ServisController.php
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\servisy; use Exception; use Mockery\CountValidator\Exact; class ServisController extends Controller { function getServices($id = null) { return $id ? servisy::find($id) : servisy::all(); } // 其他方法... }
问题排查与解决
移除重复注册的中间件
你在api中间件组和路由上同时注册了TokenMiddleware(前者直接注册,后者通过token_verify别名绑定),导致中间件被执行两次,打断了响应流程。
修改Kernel.php,从api中间件组中移除TokenMiddleware:protected $middlewareGroups = [ 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, // 移除此行:\App\Http\Middleware\TokenMiddleware::class, ], ];修复模型序列化问题
控制器直接返回模型/集合时,若模型未正确配置序列化规则(如无$fillable/$guarded、存在循环引用),会导致序列化失败,进而无响应。
修改servisy模型:namespace App\Models; use Illuminate\Database\Eloquent\Model; class servisy extends Model { // 替换为实际需要返回的字段 protected $fillable = ['name', 'description']; // 隐藏不需要返回的字段,避免循环引用 protected $hidden = ['created_at', 'updated_at']; }清除路由缓存并调试
执行以下命令清除路由缓存,确保路由规则生效:php artisan route:clear在控制器方法中添加日志,确认方法是否被执行:
function getServices($id = null) { Log::info('getServices方法已执行', ['id' => $id]); return $id ? servisy::find($id) : servisy::all(); }
内容的提问来源于stack exchange,提问作者Steve051199
相关产品推荐
相关产品推荐

