2016-04-09 42 views
1

我使用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')); 
      } 
     } 
    } 

錯誤頁面 enter image description here

+0

請提供[ mcve],這樣就可以解決一個特定的,可重現的問題。 – snakecharmerb

+0

也從錯誤消息提供的調試提示開始,因爲這是關於users表的,所以很可能存在連接。 – ndm

+0

@snakecharmerb我已經更新了一個示例代碼的帖子,所以好好看看! –

回答

-1

的錯誤是在這一行

$User = $this-> new Entity (['email' => $profile-> email]); 

你應該很

$User = $this-> newEntity ([ 'username' => 'valorunico', 'user' => $profile-> email, 'role_id' => 1]); 

測試,看看...

+0

如果您嘗試閱讀模型,您會發現我在名爲Accounts的插件中工作,因此用戶模型在Accounts插件中,但在Hybrid Auth插件中,它嘗試從src-> model-> table而不是accounts-訪問用戶模型, > src-> model-> table,所以總之在HybridAuth模型中缺少類名。 –