Php 拉威尔社交名流的名字和姓氏

Php 拉威尔社交名流的名字和姓氏,php,laravel,laravel-5.1,Php,Laravel,Laravel 5.1,我正在使用Laravel的社交名将社交身份验证添加到应用程序中。我可以检索全名,但不能分别检索名字和姓氏。在回调发生并且社交名流正在处理它之后,用户被成功地检索到。如果我要转储用户,我会从$user=this->social->driver('facebook')->user()返回我得到以下信息: object(Laravel\Socialite\Two\User)#459 (8) { ["token" ]=> string(209) "{token}" ["id"]

我正在使用Laravel的社交名将社交身份验证添加到应用程序中。我可以检索全名,但不能分别检索名字和姓氏。在回调发生并且社交名流正在处理它之后,用户被成功地检索到。如果我要转储用户,我会从
$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\u name
以及尝试转储
$user->user
数组,但我看到的只是未定义的属性错误

我不想做一些奇怪的事情,比如当名字和姓氏分开时,从全名中提取出来,因为当中间名出现时,它会变得丑陋

我用谷歌搜索了一下,奇怪的是,没有人发现这个问题。我是不是错过了什么?
非常感谢您对如何从
用户
数组中检索名字和姓氏的任何建议。

根据
$user
变量的转储,您应该能够通过执行以下操作来访问名称值:


$user->user['first\u name']
$user->user['last\u name']

我发现有时用户对象不包含名字和姓氏,除非您指定需要这些字段

//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']
你可以要求的其他东西:

对于google plus:

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

你可以简单地做:

$NameArray = explode(' ',$user->getName());
$First_name = $NameArray[0];
$Last_name = $NameArray[1];

在我自己遇到同样的问题后,我注意到我用于注册/登录的所有社交网络(Facebook、Twitter、Google+、Github)都会返回一个“name”属性。此属性可以为空(如果用户未添加任何信息),也可以带有值

我所做的是创建一个方法(getFirstLastNames()),该方法将获取“name”值,并在检测到一个或多个空格时将其分解为first\u namelast\u 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;
}
$fullName变量是:

Socialite::driver($provider)->getName();
对于此实现,我假设:

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

    $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仅使用“名称”字段。如果需要“名字”和“姓氏”,则应更改它。当然,运行“php artisan迁移:刷新”来实现更改。所有数据都将丢失

    ps2:确保名字姓氏密码字段可以为空。否则将出现错误

    ps3:在用户模型中,在$fillable属性中添加名字姓氏,并删除名字

    ps4:[非Playstation 4]如果上述过程使用您的第二个名字作为第一个名字最后一个名字,则第一个名字姓氏的值可以由您的web应用程序中的用户更改。您无法预测每个用户使用的全名,因此需要做出假设


    希望这有帮助!

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

    您还可以使用
    offsetGet()
    方法,该方法在
    AbstractUser
    类的
    socialite
    包中定义,它返回
    $this->user[$offset];
    以便使用它可以获得名字和姓氏

    但是对于facebookgoogle来说,它们的反应不同,所以我在下面给出了facebook和google的代码

    谷歌和FACEBOOK
    $user->user['first\u name']
    应执行以下操作:trick@koala_dev出于某种神奇的原因,用户数组到目前为止只是另一个未定义的属性。这很愚蠢:)请将其添加为答案,以便我可以将其标记为已回答。感谢您,每个提供商的名称部分都不一样,因此对于谷歌来说,它是
    $user->user['name']['givenName']
    $user->user['name']['familyName']
    。因为不同的提供商以不同的方式提供名字和姓氏值,难道没有一种统一的方法可以将名字和姓氏作为与社交名流分开的价值观吗?类似于
    $user->getFirstname
    $user->getLastname
    的方法。使用offsetExists方法检查值是否存在,因为如果不存在,您将得到一个错误。这不适合处理由多个单词组成的名称,这在姓氏中并不少见,但在名字中甚至可能是这样(例如Gabriel Joséde la Concordia García Márquez)。这对linkedin不起作用:/你有什么想法吗?你应该读一下:在谷歌中,你可以在用户对象中获得名为“givenName”,姓为“familyName”。
    $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(),
                ]);