2016-04-09 20 views
1

Ich benutze ADmad/CakePHP-HybridAuth Plugin für soziale Authentifizierung. Dazu folgte ich dem Dokument, das bei https://github.com/ADmad/CakePHP-HybridAuth gegeben wurde. Ich habe das selbe gemacht wie bei doc, aber ich sehe eine Ausnahme: -CakePHP ADmad CakePHP-HybridAuth Plugin warf Ausnahme

Sie müssen ein Listener für das Ereignis "HybridAuth.newUser" anhängen, das einen neuen Benutzerdatensatz speichert und eine Benutzereinheit zurückgibt.

Bitte helfen Sie mir, dieses Problem zu lösen.

Beispiel:

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); 
    } 
} 

In App Controller:

$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' 
      ], 

     ]); 

In 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')); 
      } 
     } 
    } 

Fehler Seite enter image description here

+0

Bitte geben Sie eine sein [ mcve], so dass es ein spezifisches, reproduzierbares Problem gibt, das gelöst werden kann. – snakecharmerb

+0

Beginnen Sie auch mit den Debugging-Tipps, die die Fehlermeldung bietet, da es sich hier um die Tabelle users handelt, ist es wahrscheinlich, dass eine Verbindung besteht. – ndm

+0

@snakecharmerb Ich habe den Beitrag mit einem Beispielcode aktualisiert, also bitte wieder gucken! –

Antwort

-1

Der Fehler ist in dieser Zeile

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

Sie sollten gut

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

Test zu sehen ...

+0

Wenn Sie versuchen, das Modell zu lesen, werden Sie beobachten, dass ich im Plugin mit dem Namen Accounts arbeite. Das Benutzermodell befindet sich also im Accounts Plugin, aber im Hybrid Auth Plugin versucht es auf das Benutzermodell von src-> model-> table zuzugreifen. > src-> model-> table, also gab es im hybridAuth-Modell einen Klassennamen, der fehlte. –