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

Laravel自定义中间件失效求助:已注册但未触发执行

排查Laravel + Dingo API自定义中间件失效问题

我来帮你梳理下这个自定义中间件没执行的问题,结合你用Dingo API的场景,几个常见的排查方向和解决方案如下:


1. 先确认路由是否真的被触发

你的中间件绑定在v1版本、ad前缀的路由分组里,对应的访问URL应该类似/api/v1/ad/xxx(具体要看你Dingo配置文件里的prefix设置)。如果访问路径不对,中间件自然不会执行。

可以先在notice.php里加一个极简测试路由验证:

$api->get('test', function() {
    return '测试路由已生效';
});

访问对应的URL,如果连这个测试内容都返回不了,那先解决路由可达性的问题。

2. 检查中间件的命名空间是否完整

你的AdminChange中间件代码里,必须添加正确的命名空间,否则Kernel里注册的类路径会找不到它:

namespace App\Http\Middleware; // 这一行绝对不能少!

use Closure;
use Illuminate\Http\Request;

class AdminChange {
    // ... 你的handle方法代码
}

如果缺少命名空间,Laravel无法实例化中间件,自然不会执行。

3. 尝试跳过别名,直接使用中间件完整类名

虽然你已经在Kernel.php里注册了别名,但Dingo API的路由对中间件别名的解析可能存在特殊情况。可以试着在路由分组里直接写中间件的完整类名,排除别名注册的问题:

$api->group([
    'middleware'=>[\App\Http\Middleware\AdminChange::class],
    'prefix'=>'ad'
],function($api){
    include_once(base_path('routes/v1/admin/notice.php'));
});

如果这样能看到dd的输出,说明别名注册环节可能有隐藏问题。

4. 修复中间件里的配置错误(顺带提醒)

就算中间件执行了,你当前的config配置也有问题:

// 错误写法:多了一层单引号,会把整个字符串当成类名
config(['auth.providers.users.model' => '\App\Models\Useradmin::class']);

// 正确写法:::class已经会返回带命名空间的字符串,不需要额外引号
config(['auth.providers.users.model' => \App\Models\Useradmin::class]);

5. 清除路由与配置缓存

如果之前生成过路由缓存,新添加的中间件可能不会被加载。执行以下命令清空缓存:

php artisan route:clear
php artisan config:clear

内容的提问来源于stack exchange,提问作者J.Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:31:49