Фамилия и имя Laravel Socialite

Я добавляю социальную аутентификацию в приложение, используя Larvel's Socialite. Я могу получить полное имя, но не имя и фамилию отдельно. После того, как происходит обратный вызов, и Socialite обрабатывает его, пользователь извлекается успешно. Если я хочу сбросить пользователя, я вернусь из $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 а также попытался сбросить массив $user->user но все, что я вижу, это неопределенные ошибки свойств.

Я не хочу делать что-то странное, как вытащить его из полного имени, когда четко обозначены отдельные имя и фамилия, поскольку он может стать уродливым, когда присутствуют средние имена.

У меня Googled мой путь вокруг и странно, никто не сталкивался с этим вопросом. Я что-то упустил из документов ? Любые предложения о том, как получить первое и последнее имя из массива user , очень ценятся.

Solutions Collecting From Web of "Фамилия и имя Laravel Socialite"

В соответствии с дампом $user var вы должны иметь доступ к значениям имен, выполняя:

$user->user['first_name'] и $user->user['last_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'] 

Другие вещи, которые вы можете попросить:

https://developers.facebook.com/docs/graph-api/reference/user/

для google plus:

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

Повлияв на эту же проблему, я заметил, что все социальные сети, которые я использовал для регистрации / входа в систему (Facebook, Twitter, Google+, Github), отправляют обратно атрибут « имя ». Этот атрибут может быть пустым (если пользователь не добавил никакой информации) или нести значение.

То, что я сделал, заключалось в создании метода (getFirstLastNames ()), который получит это значение « имя » и разломит его на first_name и last_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(); 

Для этой реализации я предполагаю, что:

  1. Независимо от того, сколько имен у пользователя, я буду использовать первую часть строки как first_name, а вторую – как last_name . [если мое имя POPPY PETAL EMMA ELIZABETH DEVERAUX, то я буду использовать POPPY как first_name и PETAL как last_name. Остальное будет проигнорировано]. Если атрибут « name » возвращается пустым или с одним именем, тогда я вставляю NULL в таблицу users, где я не получаю никакого значения.
  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 использует только поле « name ». Если вам нужно иметь « first_name » и « last_name », вы должны его изменить. Конечно, запустите «php artisan migrate: refresh» to Внедрить изменения. Все данные будут потеряны.

ps2: Убедитесь, что поля first_name , last_name и password могут быть обнуляемы. В противном случае вы получите сообщение об ошибке.

ps3: Внутри модели пользователя добавьте имя_имя и last_name и удалите имя в свойстве $ fillable.

ps4: [Not Playstation 4] Значения first_name и last_name могут быть изменены пользователем в вашем веб-приложении, если в приведенной выше процедуре использовалось ваше второе имя как first_name или last_name . Вы не можете предсказать, что каждый пользователь использует как полное имя, поэтому вам нужно сделать предположения.

Надеюсь это поможет!

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

И вы могли бы просто сделать:

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