我正在尝试在cakephp 2.0中创建一个更改密码表单。我发现了EuroMark为1.3创建的行为,现在很难将此代码转换为使用2.0。我知道它与Auth组件有关,因为2.0中的这个组件发生了重大变化。
public function validateCurrentPwd(Model $Model, $data) {
if (is_array($data)) {
$pwd = array_shift($data);
} else {
$pwd = $data;
}
$uid = null;
if ($Model->id) {
$uid = $Model->id;
} elseif (!empty($Model->data[$Model->alias]['id'])) {
$uid = $Model->data[$Model->alias]['id'];
} else {
return false;
}
if (class_exists('AuthExtComponent')) {
$this->Auth = new AuthExtComponent();
} elseif (class_exists($this->settings[$Model->alias]['auth'].'Component')) {
$auth = $this->settings[$Model->alias]['auth'].'Component';
$this->Auth = new $auth();
} else {
return true;
}
return $this->Auth->verifyUser($uid, $pwd);
}
我在读取$ this->的线路上收到错误:Auth = new $ auth(); 错误如下:
Argument 1 passed to Component::__construct() must be an instance of ComponentCollection, none given, called in C:\UniServer\www\new_company_test\app\Model\Behavior\change_password.php on line 117 and defined [CORE\Cake\Controller\Component.php, line 77]
和
Undefined variable: collection [CORE\Cake\Controller\Component.php, line 78]
它也在抛出这个
Call to undefined method AuthComponent::verifyUser() in C:\UniServer\www\new_company_test\app\Model\Behavior\change_password.php on line 121
我不确定脚本中是否还有其他需要解决的问题,我猜不会因为没有其他地方使用Auth。
关于我需要做些什么才能让它发挥作用?任何帮助表示赞赏。 感谢
答案 0 :(得分:1)
你确实发现还有一个2.0分支,不是吗? :) 它应该包含相同的行为: https://github.com/dereuromark/tools/tree/2.0
无论哪种方式,您都需要将组件集合传递给它:
$this->Auth = new AuthExtComponent(new ComponentCollection());
您应该在自定义AuthExt组件中创建方法verifyUser
,该方法将“当前密码”的Auth组件扩展为以下方式:
/**
* Quickfix
* TODO: improve - maybe use Authenticate
* @return bool $success
*/
public function verifyUser($id, $pwd) {
$options = array(
'conditions' => array('id'=>$id, 'password'=>$this->password($pwd)),
);
return $this->getModel()->find('first', $options);
$this->constructAuthenticate();
$this->request->data['User']['password'] = $pwd;
return $this->identify($this->request, $this->response);
}
/**
* returns the current User model
* @return object $User
*/
public function getModel() {
return ClassRegistry::init(CLASS_USER);
}
也许也可以直接在行为中使用现有的identify
方法和假请求对象?
我正在考虑使用
$this->authenticate = array('Form'=>array('fields'=>array('username' => 'id')));
随意分叉行为并提交拉取请求。
“当前密码”是目前尚未完全解决的唯一问题。