2014-01-05 1 views
0

Я пытаюсь использовать поведение DerEuromark's Passwordable с моим приложением CakePHP, но у меня проблемы с его работой. Я выполнил инструкции по установке (http://www.dereuromark.de/2011/08/25/working-with-passwords-in-cakephp/), изменив свой контроллер и виды, но я все время получаю сообщение об ошибке, заявляя, что мои BeforeValidate и BeforeSave несовместимы с поведением - и, конечно, поведение не работает.CakePHP: BeforeSave & BeforeValidate с PasswordableBehavior

Я знаю, что мне нужно, чтобы эти две настройки были правильно настроены в моей модели, но я не знаю, как они должны выглядеть: инструкции не охватывают этот момент.

Что должно быть основной, ваниль BeforeValidate и BeforeSave должно быть похоже, что работает с таким образом?

Под моим контроллером Пользователи:

public function register() { 
if ($this->request->is('post') || $this->request->is('put')) { 
    $this->User->Behaviors->attach('Tools.Passwordable'); 
    if ($this->User->save($this->request->data, true, array('username', 'name', 'email', 'pwd', 'pwd_repeat', 'group_id'))) { 
    $this->Session->setFlash(__('The user has been saved'), 'flash/success'); 
      $this->redirect(array('action' => 'index')); 
} else { 
      $this->Session->setFlash(__('The user could not be saved. Please, try again.'), 'flash/error'); 
     } 
    unset($this->request->data['User']['pwd']); 
    unset($this->request->data['User']['pwd_repeat']); 
} 

Passwordable поведение с BeforeValidate и BeforeSave, что мои user.php должен быть совместим с: https://github.com/dereuromark/tools/blob/master/Model/Behavior/PasswordableBehavior.php

Погрешность:

Strict (2048): Declaration of PasswordableBehavior::beforeValidate() should be compatible with ModelBehavior::beforeValidate(Model $model, $options = Array) [APP/Plugin/Tools/Model/Behavior/PasswordableBehavior.php, line 338] 
Strict (2048): Declaration of PasswordableBehavior::beforeSave() should be compatible with ModelBehavior::beforeSave(Model $model, $options = Array) [APP/Plugin/Tools/Model/Behavior/PasswordableBehavior.php, line 338] 

Edit: Модель пользователя:

<?php 
App::uses('AppModel', 'Model'); 
App::uses('AuthComponent', 'Controller/Component'); 
App::uses('PasswordableBehavior', 'Tools.Model/Behavior'); 
/** 
* User Model 
* 
* @property Group $Group 
* @property Post $Post 
*/ 
class User extends AppModel { 

    //simplified per-group only permissions- tell ACL to skip checking user AROs and only check group AROs 
    public function bindNode($user) { 
    return array('model' => 'Group', 'foreign_key' => $user['User']['group_id']); 
} 

/** 
* Validation rules 
* 
* @var array 
*/ 
public $validate = array(
    'username' => array(
     'notEmpty' => array(
      'rule' => array('notEmpty'), 
      //'message' => 'Your custom message here', 
      //'allowEmpty' => false, 
      //'required' => false, 
       //'last' => false, // Stop validation after this rule 
       //'on' => 'create', // Limit validation to 'create' or 'update' operations 
      ), 

        'username' => array(
      'rule' => 'isUnique', 
      'required' => true, 
      'allowEmpty' => false, 
      'on' => 'create', 
      'last' => false, 
      'message' => 'That username has already been taken' 
    ), 
     ), 


     'email' => array(
      'email' => array(
       'rule' => array('email'), 
       //'message' => 'Your custom message here', 
       //'allowEmpty' => false, 
       //'required' => false, 
       //'last' => false, // Stop validation after this rule 
       //'on' => 'create', // Limit validation to 'create' or 'update' operations 
      ), 
     ), 
     'password' => array(
      'notEmpty' => array(
       'rule' => array('notEmpty'), 
       //'message' => 'Your custom message here', 
       //'allowEmpty' => false, 
       //'required' => false, 
       //'last' => false, // Stop validation after this rule 
       //'on' => 'create', // Limit validation to 'create' or  'update' operations 
      ), 
     ), 
     'group_id' => array(
      'numeric' => array(
       'rule' => array('numeric'), 
       //'message' => 'Your custom message here', 
       //'allowEmpty' => false, 
       //'required' => false, 
       //'last' => false, // Stop validation after this rule 
      //'on' => 'create', // Limit validation to 'create' or 'update' operations 
     ), 
    ), 
); 

//The Associations below have been created with all possible keys, those that are   not needed can be removed 

/** 
* belongsTo associations 
* 
* @var array 
*/  
    public $belongsTo = array(
     'Group' => array(
      'className' => 'Group', 
      'foreignKey' => 'group_id', 
      'conditions' => '', 
      'fields' => '', 
      'order' => '' 
     ) 
    ); 

    public $actsAs = array('Acl' => array('type' => 'requester')); 

    public function parentNode() { 
     if (!$this->id && empty($this->data)) { 
      return null; 
     } 
     if (isset($this->data['User']['group_id'])) { 
      $groupId = $this->data['User']['group_id']; 
     } else { 
      $groupId = $this->field('group_id'); 
     } 
     if (!$groupId) { 
      return null; 
     } else { 
      return array('Group' => array('id' => $groupId)); 
     } 
    } 

/** 
* hasMany associations 
* 
* @var array 
*/ 
    public $hasMany = array(
     'Post' => array(
      'className' => 'Post', 
      'foreignKey' => 'user_id', 
      'dependent' => false, 
      'conditions' => '', 
      'fields' => '', 
      'order' => '', 
      'limit' => '', 
      'offset' => '', 
      'exclusive' => '', 
      'finderQuery' => '', 
      'counterQuery' => '' 
     ) 
    ); 

    public function beforeValidate($options = array()) { 

    } 


public function beforeSave($options = array()) { 

} 

} 
+0

Пожалуйста, обновите свой вопрос с кодом вашей модели 'User'. – Jan

+0

Я добавил модель. У меня есть фиктивные функции, настроенные для BeforeValidate и BeforeSave, но они пока ничего не делают. Насколько я понимаю, PasswordableBehavior должен принимать pwd и pwd_repeat, сравнивать их и хешировать, если они совпадают - это правильно? Есть ли что-то еще, что мне нужно для правильной маршрутизации этих переменных? – schnauss

ответ

1

Убедитесь, что подпись метода совпадает. Параметры метода должны быть такими же, как и параметры метода родительского класса.

Возможно, вы забыли их в своей модели пользователя.

Если вы действительно используете код, на который вы отправили ссылку, сигнатуры метода верны. Возможно, вы используете более старую версию или ошибаетесь в своей модели пользователя.

Также необходимо обновить свойство $actsAs, чтобы использовать поведение.

public $actsAs = array(
    'Acl' => array('type' => 'requester'), 
    'Passwordable', 
); 

Кроме того, beforeSave и beforeValidate должны вернуться верно для того, чтобы приступить к процессу сохранения. В противном случае он прерывается. См. http://book.cakephp.org/2.0/en/models/callback-methods.html.

+0

Вы уверены, что вам нужно добавить '$ actAs'? Когда я это делаю, он внезапно говорит «Behavior Not Found» - даже если плагин установлен и добавлен в бутстрап. – schnauss

+1

О, вы используете Passwordable как поведение плагина. Используйте '$ actAs' с' 'Tools.Passwordable'' (префикс имени плагина с использованием точечного синтаксиса) вместо' 'Passwordable''. Вы должны использовать 'actAs', потому что в противном случае ваше поведение не будет применено к вашей модели. – Jan

1

Ошибка уже говорит вам уже довольно точно, что вам нужно сделать: Сделать сигнатуру метода поведением согласованной подписи подписи метода ModelBehavior.

Похоже, что плагин не был обновлен, чтобы отразить изменения в последних выпусках CakePHP. Был добавлен массив параметров.

+0

Спасибо. Я предполагал, что переменные/массивы не передаются правильно, но я не мог сказать, глядя на поведение, как я должен был настроить BeforeValidate и BeforeSave.Поскольку CakePHP нацелен на DRY, я надеялся, что могу просто использовать заглушки, но это, похоже, не так. Я довольно новичок в этом и учил себя, разбираясь и изменяя примерный код. :) – schnauss

+0

Это не проблема CakePHP, а изменение PHP 5.4. Вы можете отключить его, но я бы рекомендовал вам обновить поведение и сообщить автору об этом. См. Http://stackoverflow.com/questions/12229113/how-to-eliminate-php5-strict-standards-errors. – burzum

0

в вас PasswordableBehavior сделать это для обоих ваших методов (beforeValidate, BeforeSave)

public function beforeValidate ($options=array()) { 
    ... 
    ... 
} 

//or try this if it didn't work 
public function beforeValidate (Model $model, $options=array()) { 
    ... 
    ... 
}