我正在使用Laravel的社交名流向应用程序添加社交身份验证。我可以分别检索全名,但不能检索名字和姓氏。回调发生后,Socialite正在处理它,成功检索用户。如果我要转储用户,我会从---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
18 conn.close()
19
---> 20 b = bitarray.frombytes(rec[1])
TypeError: descriptor 'frombytes' requires a 'bitarray._bitarray' object but received a 'buffer'
返回,我会收到以下信息:
$user = this->social->driver('facebook')->user();
}
我可以通过object(Laravel\Socialite\Two\User)#459 (8) {
["token" ]=> string(209) "{token}"
["id"] => string(17) "{socialID}"
["nickname"] => NULL
["name"] => string(14) "{Full Name}"
["email"] => string(19) "{Email address}"
["avatar"] => string(69) "https://graph.facebook.com/v2.4/{socialID}/picture?type=normal"
["user"] => array(6) {
["first_name"] => string(6) "{First name}"
["last_name"] => string(7) "{Last mame}"
["email"] => string(19) "{Email address}"
["gender"] => string(4) "male"
["verified"] => bool(true)
["id"] => string(17) "{socialID}"
}
["avatar_original"] => string(68) "https://graph.facebook.com/v2.4/{socialID}/picture?width=1920"
或$user->name
获取全名或电子邮件但是,我无法获得单独的名字和姓氏。我尝试了$user->email
以及尝试转储$user->first_name
数组,但我看到的都是未定义的属性错误。
我不想做一些奇怪的事情,比如当单独的名字和姓氏明确存在时从全名中提取它,因为当中间名存在时它会变得丑陋。
我用Google搜索了一下,奇怪的是,没有人遇到过这个问题。我错过了the docs的内容吗?
关于如何从$user->user
数组中检索名字和姓氏的任何建议都非常感谢。
答案 0 :(得分:12)
我发现有时用户对象不会包含名字和姓氏,除非您指定需要这些字段。
//get the driver and set desired fields
$driver = Socialite::driver('facebook')
->fields([
'name',
'first_name',
'last_name',
'email',
'gender',
'verified'
]);
// retrieve the user
$user = $driver->user();
然后你可以获得这样的名字和姓氏
$user->user['first_name'] and $user->user['last_name']
你可以要求的其他东西:
https://developers.facebook.com/docs/graph-api/reference/user/
for google plus:
$user->firstname = $user->user['name']['givenName'];
$user->lastname = $user->user['name']['familyName'];
答案 1 :(得分:4)
根据$user
var的转储,您应该可以通过执行以下操作来访问名称值:
$user->user['first_name']
和$user->user['last_name']
答案 2 :(得分:3)
您还可以使用offsetGet()
包的AbstractUser
类中定义的socialite
方法,该方法返回$this->user[$offset];
,因此您可以使用它获得名字和姓氏,
但是对于 facebook 和 google ,由于它们的响应不同而有所不同,因此我在下面给出了针对facebook和google的代码。
$providerUser = Socialite::driver($provider)->user(); // $provider can be facebook, google etc.
switch($provider){
case 'facebook':
$first_name = $providerUser->offsetGet('first_name');
$last_name = $providerUser->offsetGet('last_name');
break;
case 'google':
$first_name = $providerUser->offsetGet('given_name');
$last_name = $providerUser->offsetGet('family_name');
break;
// You can also add more provider option e.g. linkedin, twitter etc.
default:
$first_name = $providerUser->getName();
$last_name = $providerUser->getName();
}
$user = User::create([
'first_name' => $first_name,
'last_name' => $last_name,
'email' => $providerUser->getEmail(),
'image' => $providerUser->getAvatar(),
]);
答案 3 :(得分:1)
在linkedin中,您可以从提供商那里获得名字和姓氏。
$linkedinUser = $this->socialite->driver('linkedin')->user());
$attributes = [
'first_name' => $linkedinUser->user['firstName'],
'last_name' => $linkedinUser->user['lastName'],
'email' => $linkedinUser->email,
'avatar' => $linkedinUser->avatar,
'linkedin_id' => $linkedinUser->id
];
答案 4 :(得分:0)
你可以这样做:
$NameArray = explode(' ',$user->getName());
$First_name = $NameArray[0];
$Last_name = $NameArray[1];
答案 5 :(得分:0)
在我自己反对同一问题后,我注意到我用于注册/登录(Facebook,Twitter,Google +,Github)的所有社交网络都发回了“名称”属性。此属性可以为空(如果用户未添加任何信息)或携带值。
我做的是创建一个方法(getFirstLastNames()),它将获得“ name ”值并将其分解为 first_name 和 last_name < / strong>通过在检测到空格或多个空格时将它们爆炸。然后我用它们来填充我的用户表:
protected function getFirstLastNames($fullName)
{
$parts = array_values(array_filter(explode(" ", $fullName)));
$size = count($parts);
if(empty($parts)){
$result['first_name'] = NULL;
$result['last_name'] = NULL;
}
if(!empty($parts) && $size == 1){
$result['first_name'] = $parts[0];
$result['last_name'] = NULL;
}
if(!empty($parts) && $size >= 2){
$result['first_name'] = $parts[0];
$result['last_name'] = $parts[1];
}
return $result;
}
$ fullName变量是:
Socialite::driver($provider)->getName();
对于这个实现,我假设:
现在您已拥有数组中的数据,您可以在创建用户时使用它们:
$userFirstLastName = $this->getFirstLastNames(Socialite::driver($provider)->getName());
$user = User::create([
'email' => Socialite::driver($provider)->getName()->getEmail(),
'first_name' => $userFirstLastName['first_name'],
'last_name' => $userFirstLastName['last_name'],
]);
ps1:确保更改用户的迁移表(Laravel 5.3仅使用“名称”字段。如果您需要“ first_name ”和“< strong> last_name “你应该改变它。当然运行”php artisan migrate:refresh“来实现更改。所有数据都将丢失。
ps2:确保 first_name , last_name 和密码字段可以为空。否则你会收到错误。
ps3:内部用户模型,添加 first_name 和 last_name ,并删除$ fillable属性中的名称。
ps4:[不是Playstation 4]如果上述过程使用您的第二个名称为< first_name 和 last_name 值,则可以在您的网络应用中更改 first_name 和 last_name 值strong> first_name 或 last_name 。您无法预测每个用户使用的全名,因此您需要做出假设。
希望这有帮助!