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
相关产品推荐
相关产品推荐

