我使用ADmad/CakePHP-HybridAuth插件進行社交身份驗證。爲此,我按照https://github.com/ADmad/CakePHP-HybridAuth給出的文檔。我做的和在doc上做的一樣,但我面臨一個例外情況: -CakePHP ADmad CakePHP-HybridAuth插件拋出異常
您必須爲「HybridAuth.newUser」事件附加一個偵聽器,它保存新用戶記錄並返回用戶實體。
請幫我解決這個問題。
實施例:
的usermodel:
<?php
namespace Accounts\Model\Table;
use Accounts\Model\Entity\User;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validation;
use Cake\Validation\Validator;
use Cake\Event\Event;
use Cake\Event\EventManager;
/**
* Users Model
*
* @property \Cake\ORM\Association\BelongsTo $Roles
*/
class UsersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('first_name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Roles', [
'foreignKey' => 'role_id',
'joinType' => 'LEFT',
'className' => 'Accounts.Roles',
]);
$this->hasOne('Profiles', [
'foreignKey' => 'user_id',
'className' => 'Accounts.Profiles',
'dependent' => true
]);
$this->hasMany('ADmad/HybridAuth.SocialProfiles');
EventManager::instance()->on('HybridAuth.newUser', [$this, 'createUser']);
}
public function createUser(Event $event) {
// Entity representing record in social_profiles table
$profile = $event->data()['profile'];
$user = $this->newEntity(['email' => $profile->email]);
$user = $this->save($user);
if (!$user) {
throw new \RuntimeException('Unable to save new user');
}
return $user;
}
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmpty('id', 'create');
return $validator;
}
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['email']));
$rules->add($rules->isUnique(['username']));
$rules->add($rules->existsIn(['role_id'], 'Roles'));
return $rules;
}
public function beforeSave($event, $entity, $options){
if($entity->first_name)
$entity->slug = $this->createSlug($entity->first_name);
}
}
在應用控制器:
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'username',
'password' => 'password'
]
],
'ADmad/HybridAuth.HybridAuth'
],
'loginAction' => [
'controller' => 'Users',
'action' => 'login',
'plugin' => 'Accounts'
],
'loginRedirect' => [
'controller' => 'Users',
'action' => 'login',
'plugin' => 'Accounts'
],
]);
在UsersController:
public function login()
{
if($this->Auth->user()){
$this->redirect(array('action'=>'index', 'controller'=>'Users', 'plugin'=>'Accounts'));
}else{
if ($this->request->is('post') || $this->request->query('provider')) {
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->error(__('Invalid username or password, try again'));
}
}
}
請提供[ mcve],這樣就可以解決一個特定的,可重現的問題。 – snakecharmerb
也從錯誤消息提供的調試提示開始,因爲這是關於users表的,所以很可能存在連接。 – ndm
@snakecharmerb我已經更新了一個示例代碼的帖子,所以好好看看! –