Laravel扩展Passport AccessTokenController时调用respondToAccessTokenRequest报空错误
Laravel Passport 继承 AccessTokenController 时出现 "Call to a member function respondToAccessTokenRequest() on null" 错误解决
我是Laravel新手,尝试通过继承Laravel Passport的AccessTokenController类来生成OAuth令牌,但始终遇到如下错误:
"message": "Call to a member function respondToAccessTokenRequest() on null"
自定义控制器代码
class B2BTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController { function issueB2BToken(ServerRequestInterface $request) { $req = $request->withParsedBody([ "grant_type" => "client_credentials", "client_id" => $request->getHeaderLine('X-CLIENT-KEY'), "client_secret" => $request->getHeaderLine('X-SIGNATURE'), ]); $response = parent::issueToken($req); return $response->getContent(); } }
原生 AccessTokenController 代码
class AccessTokenController { use HandlesOAuthErrors; /** * The authorization server. * * @var \League\OAuth2\Server\AuthorizationServer */ protected $server; /** * The token repository instance. * * @var \Laravel\Passport\TokenRepository */ protected $tokens; /** * Create a new controller instance. * * @param \League\OAuth2\Server\AuthorizationServer $server * @param \Laravel\Passport\TokenRepository $tokens * @return void */ public function __construct(AuthorizationServer $server, TokenRepository $tokens) { $this->server = $server; $this->tokens = $tokens; } /** * Authorize a client to access the user's account. * * @param \Psr\Http\Message\ServerRequestInterface $request * @return \Illuminate\Http\Response */ public function issueToken(ServerRequestInterface $request) { return $this->withErrorHandling(function () use ($request) { return $this->convertResponse( $this->server->respondToAccessTokenRequest($request, new Psr7Response) ); }); } }
问题原因
父类AccessTokenController的$server和$tokens属性依赖构造函数注入实例,自定义控制器未显式调用父类构造函数,导致这两个属性未初始化,调用$this->server->respondToAccessTokenRequest()时触发空指针错误。
解决方法
在自定义控制器中添加构造函数,继承父类的依赖注入逻辑:
class B2BTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController { // 显式调用父类构造函数,确保依赖实例被正确注入 public function __construct(\League\OAuth2\Server\AuthorizationServer $server, \Laravel\Passport\TokenRepository $tokens) { parent::__construct($server, $tokens); } function issueB2BToken(\Psr\Http\Message\ServerRequestInterface $request) { $req = $request->withParsedBody([ "grant_type" => "client_credentials", "client_id" => $request->getHeaderLine('X-CLIENT-KEY'), "client_secret" => $request->getHeaderLine('X-SIGNATURE'), ]); $response = parent::issueToken($req); return $response->getContent(); } }
额外注意事项
- 确保路由正确配置,指向
B2BTokenController@issueB2BToken方法 - 请求必须携带
X-CLIENT-KEY和X-SIGNATURE请求头,且对应的值是有效的Passport客户端ID和密钥
内容的提问来源于stack exchange,提问作者Gusti Arya
相关产品推荐
相关产品推荐

