Я использую модуль ScnSocialAuth ZF2 для включения проверки подлинности в социальных сетях в моем проекте.
Поскольку он использует ZfcUser как одну из своих зависимостей, по умолчанию создаются / используются две таблицы БД:
CREATE TABLE `user` ( `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR(255) DEFAULT NULL UNIQUE, `email` VARCHAR(255) DEFAULT NULL UNIQUE, `display_name` VARCHAR(50) DEFAULT NULL, `password` VARCHAR(128) NOT NULL, `state` SMALLINT UNSIGNED ) ENGINE=InnoDB CHARSET="utf8";
а также
CREATE TABLE IF NOT EXISTS `user_provider` ( `user_id` INT NOT NULL, `provider_id` varchar(50) NOT NULL, `provider` varchar(255) NOT NULL, PRIMARY KEY (`user_id`,`provider_id`), UNIQUE KEY (`provider_id`,`provider`), FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ) ENGINE=InnoDB;
Я хотел бы добавить больше полей в обе таблицы.
Первым шагом было изменение этих таблиц на моем сервере БД.
Затем я переопределяю объекты и классы User и UserProvider (добавляя свойства и их получатели и сеттеры) и настраиваю файлы конфигурации (zfcuser.global.php и scn-social-auth.global.php), чтобы они использовали эти новые сущности. Здесь все работает гладко.
Теперь я хочу получить данные профиля пользователя и сохранить их в этих таблицах во время авторизации (даже используя эти данные для заполнения новой пользовательской записи или для обновления существующей).
Глядя на метод ScnSocialAuth \ Authentication \ Adapter \ HybridAuth :: authenticate (), я понял, что при аутентификации пользователя устанавливаются только следующие поля:
user.email user.password user.display_name user_provider.user_id user_provider.provider_id user_provider.provider
оставляя мои добавленные поля (например: пол, birth_day, регион и т. д.) пустым.
Еще одна вещь, которую я заметил, проверяя, как работает класс \ ScnSocialAuth \ Authentication \ Adapter \ HybridAuth, заключается в том, что сущности гидратируются «жестко». Например:
protected function facebookToLocalUser($userProfile) { ... $localUser = $this->instantiateLocalUser(); $localUser->setEmail($userProfile->emailVerified) ->setDisplayName($userProfile->displayName) ->setPassword(__FUNCTION__); $result = $this->insert($localUser, 'facebook', $userProfile); return $localUser; }
Может ли кто-нибудь объяснить, что является лучшим способом расширить / переопределить метод authenticate (), чтобы я мог установить эти новые поля со значениями из профиля пользователя? Конечно, без изменения исходного метода.
благодаря