auth:sanctum中件间是如何被注入到laravel中的?
SanctumServiceProvider
和 AuthManager
的关系如下:
1. AuthManager 的作用
AuthManager
是 Laravel 框架核心的认证管理器,负责管理所有的认证 guard(如 session、token、sanctum 等)。- 它通过
extend()
方法允许第三方包或应用扩展自定义的 guard 驱动。 - 当你调用
auth('xxx')
或Auth::guard('xxx')
时,AuthManager
会根据配置和注册的驱动返回对应的 guard 实例。
2. SanctumServiceProvider 的作用
SanctumServiceProvider
是 Sanctum 包的服务提供者。- 它的核心任务之一,就是通过调用
AuthManager::extend()
方法,向 Laravel 注册一个名为sanctum
的自定义 guard 驱动。 - 这样,
auth:sanctum
中间件或guard('sanctum')
就能被 Laravel 识别和使用。
3. 两者的关系(流程)
- 服务提供者注册阶段
Laravel 启动时会自动加载SanctumServiceProvider
。 扩展 Guard
在SanctumServiceProvider
的boot()
或register()
方法中,调用如下代码(伪代码,实际见 vendor/laravel/sanctum/src/SanctumServiceProvider.php):$this->app['auth']->extend('sanctum', function ($app, $name, array $config) { // 返回 Sanctum 的 Guard 实例 });
这里的
$this->app['auth']
实际上就是AuthManager
实例。- AuthManager::extend()
extend()
方法会把 sanctum 驱动的创建逻辑注册到$customCreators
数组中。 - 路由或中间件使用
当你在路由中用auth:sanctum
时,Laravel 会通过AuthManager
查找并实例化 sanctum guard,执行认证逻辑。
4. 总结
- SanctumServiceProvider 负责注册 sanctum guard 到 AuthManager。
- AuthManager 负责统一管理和调度所有 guard,包括 sanctum。
- 这种机制让 Laravel 的认证系统高度可扩展,第三方包(如 Sanctum)可以无缝集成自定义认证方式。
关系图
graph TD
A[SanctumServiceProvider] -- 调用 extend('sanctum') --> B[AuthManager]
B -- 统一管理 --> C[Sanctum Guard 实例]
D[auth:sanctum 中间件] -- 通过 AuthManager 获取 --> C
如需源码细节,可查阅:
vendor/laravel/sanctum/src/SanctumServiceProvider.php
vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php