You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
    // 其他方法...
}

问题排查与解决

  1. 移除重复注册的中间件
    你在api中间件组和路由上同时注册了TokenMiddleware(前者直接注册,后者通过token_verify别名绑定),导致中间件被执行两次,打断了响应流程。
    修改Kernel.php,从api中间件组中移除TokenMiddleware:

    protected $middlewareGroups = [
        'api' => [
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            // 移除此行:\App\Http\Middleware\TokenMiddleware::class,
        ],
    ];
    
  2. 修复模型序列化问题
    控制器直接返回模型/集合时,若模型未正确配置序列化规则(如无$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'];
    }
    
  3. 清除路由缓存并调试
    执行以下命令清除路由缓存,确保路由规则生效:

    php artisan route:clear
    

    在控制器方法中添加日志,确认方法是否被执行:

    function getServices($id = null)
    {
        Log::info('getServices方法已执行', ['id' => $id]);
        return $id ? servisy::find($id) : servisy::all();
    }
    

内容的提问来源于stack exchange,提问作者Steve051199

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:22:49