Я добавляю социальную аутентификацию в приложение, используя 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
, очень ценятся.
В соответствии с дампом $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();
Для этой реализации я предполагаю, что:
Теперь, когда у вас есть данные в массиве, вы можете использовать их при создании пользователя:
$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];