Laravel Socialite的名字和姓氏

时间:2015-09-04 22:51:00

标签: php laravel laravel-5.1

我正在使用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数组中检索名字和姓氏的任何建议都非常感谢。

6 个答案:

答案 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的代码。

对于GOOGLE和FACEBOOK

$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();

对于这个实现,我假设:

  1. 无论用户拥有多少个名字,我都会将字符串的第一部分用作 first_name ,将第二部分用作 last_name 。 [如果我的名字是POPPY PETAL EMMA ELIZABETH DEVERAUX,那么我将使用POPPY作为first_name,PETAL作为last_name使用。其余的将被忽略]。如果“ name ”属性返回空或带有一个名称,那么我将NULL插入到users表中,其中我没有得到任何值。
  2. 如果用户在分隔名称时(或名称前后)使用了多个空格,则此方法将删除它们并仅保留字符串。
  3. 现在您已拥有数组中的数据,您可以在创建用户时使用它们:

    $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 。您无法预测每个用户使用的全名,因此您需要做出假设。

    希望这有帮助!