2015-09-04 53 views
3

我加入的社会身份验证使用Laravel的社会名流的应用程序。我可以检索完整的名字,但不能分开名字和姓氏。回调发生后,Socialite处理它,用户成功检索。如果我要倾我从$user = this->social->driver('facebook')->user();回到用户,我得到以下几点:Laravel社会名流的名字和姓氏

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以及试图转储$user->user数组,但我看到的是未定义的属性错误。

我不想做一些怪异像全名解压时分离的第一和最后一个名字是明显存在,因为它可以变得很恶劣时的中间名是存在的。

我用Google搜索周围的古怪和我的方式,没有人碰到这个问题。我是否缺少the docs? 有关如何从user阵列中检索名字和姓氏的任何建议,我们都非常感谢。

+0

'$用户>用户[“FIRST_NAME”]'应该做的伎俩 –

+0

@koala_dev对于一些神奇的原因,用户阵列只是另一个未定义的属性直到现在。这是愚蠢的:)请将此添加为答案,以便我可以将其标记为已回答。谢谢 – junkystu

回答

2

按照$user VAR的转储,你应该能够做访问名值:

$user->user['first_name']$user->user['last_name']

+0

请注意,名称部分与每个提供者不同,所以对于Google来说,例如'$ user-> user ['name'] ['givenName']'和'$ user-> user ['name'] ['' familyName']'。 –

+0

由于不同的提供者以不同的方式提供姓氏和名字的价值,是不是有一种通过Socialite获取名字和姓氏作为分离值的一致方式?像'$ user-> getFirstname'和'$ user-> getLastname'。 – Camilo

10

我发现,有时候用户对象将不包含第一和姓氏,除非你指定你需要这些字段。

//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/

为谷歌加:

$user->firstname = $user->user['name']['givenName']; 
$user->lastname = $user->user['name']['familyName']; 
+0

这解决了我的问题,谢谢! –

+0

这不适用于linkedin:/您有任何想法? – Kaherdin

-1

而且你可以简单地做:

+0

这不能很好地处理由多个单词组成的名称,这在名字中并不罕见,但名字中甚至可以是这种情况(例如GabrielJoséde la ConcordiaGarcíaMárquez)。 – trincot

0

未来对同一问题我自己之后,我注意到,我用于注册/登录所有的社交网络(Facebook的,Twitter,谷歌,Github上)发回一个“ “属性。该属性可以是空的(如果用户没有添加任何信息)或携带一个值。

我做什么,是要建立一个方法(getFirstLastNames()),将获得的是“”值与检测空格或多个空格时分解成FIRST_NAME姓氏爆炸的方式他们。然后我用它们来填充我的用户表:

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; 
} 

的$全名变量是:

Socialite::driver($provider)->getName(); 

对于此实现我假设:

  1. 无论有多少名用户有,我将使用字符串的第一部分作为名字和第二个作为姓氏。 [如果我的名字是POPPY PETAL EMMA ELIZABETH DEVERAUX,那么我将使用POPPY作为姓氏和PETAL作为姓氏。其余的将被忽略]。如果“名称”属性返回空或具有一个名称,那么我将NULL插入用户表中,我没有任何价值。
  2. 如果用户在分隔名称(或名称前后)时使用了多个空格,则此方法将删除它们并仅保留字符串。

    $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“和” 姓氏“你应该改变它当然运行。‘PHP工匠迁移:刷新’以实现更改的所有数据都将丢失

ps2:确保名字,姓氏密码字段可以为空。否则,你会得到一个错误。

PS3:内部用户模型,添加FIRST_NAME姓氏和$可填写的属性中删除

PS4:[不游戏机4] 如first_namelast_name的值可以由用户网络应用程序内改变,如果上述过程中使用的第二名称作为如first_name姓氏。你无法预测每个用户使用什么全名,所以你需要做出假设。

希望这会有所帮助!

+0

你应该阅读:http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ – Edward

0

在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 
    ]; 
+0

另外在谷歌,你可以得到名字为'givenName',姓氏为'familyName '在用户对象中。 – nlagdhir