使用Laravel Passport调用createToken后出现非对象取'id'属性错误
解决Laravel Passport创建Token时的“Trying to get property 'id' of non-object”错误
这个错误指向很明确——你在自定义的createRequest方法里尝试访问$client->id,但传入的$client并不是一个有效的Laravel\Passport\Client对象(大概率是null或者非预期的类型),才会触发这个属性获取失败的异常。
问题排查与解决方案:
确认
$client的来源是否正确
创建个人访问令牌时,Passport要求使用的是Personal Access Client,而非普通OAuth客户端。你需要检查调用createRequest时传入的$client参数是怎么获取的,确保用正确方式拿到合法的客户端实例:// 方法1:通过查询获取个人访问客户端 $client = \Laravel\Passport\Client::where('personal_access_client', true)->first(); // 方法2:使用Passport提供的快捷方法 $client = \Laravel\Passport\Passport::personalAccessClient();如果获取到的
$client是null,说明你还没配置Personal Access Client,需要先执行php artisan passport:client --personal命令生成它。在
createRequest中添加容错校验
为了避免后续再出现类似问题,建议在方法开头增加类型校验,提前拦截无效参数:protected function createRequest($client, $userId, array $scopes) { // 校验client是否为合法的Passport Client实例 if (!$client instanceof \Laravel\Passport\Client) { throw new \InvalidArgumentException('必须传入有效的Laravel Passport客户端对象'); } return (new ServerRequest)->withParsedBody([ 'grant_type' => 'personal_access', 'client_id' => $client->id, 'client_secret' => $client->secret, 'user_id' => $userId, 'scope' => implode(' ', $scopes), ]); }额外检查
$userId的有效性
虽然当前错误来自$client->id,也可以顺带确认下$userId是users表中存在的合法ID,避免后续流程出现其他异常。
只要确保传入createRequest的$client是一个存在的、有效的Passport Client对象,这个错误就能彻底解决啦!
内容的提问来源于stack exchange,提问作者reza baghiee
相关产品推荐
相关产品推荐

