所以我一直在尝试在我的应用程序中使用编辑用户功能,我对如何使用CakePHP 3进行此操作感到有点困惑。这就是我的编辑操作。在我的UsersController.php中:
public function edit() {
$this->layout = 'dashboard';
$user = $this->Users->get($this->Auth->user('id'));
if ($this->request->is(['post', 'put'])) {
$this->Users->patchEntity($user, $this->request->data);
if ($this->Users->save($user)) {
$this->Flash->success(__('Your account has been edited'));
return $this->redirect(['controller' => 'Users', 'action' => 'edit']);
}
$this->Flash->error(__('Your account could not be edited. Please fix errors below.'));
}
$this->set(compact('user'));
}
在我的edit.ctp文件中:
<?php
$this->Form->templates($form_templates['defaultBootstrap']);
echo $this->Form->create($user);
?>
<fieldset>
<legend><?php echo __('Edit Profile'); ?></legend>
<?php
echo $this->Form->input('email', [
'label' => __('Email'),
'placeholder' => __('Email'),
'autofocus'
]);
echo $this->Form->input('currency', [
'label' => __('Default Currency'),
'options' => [
'CAD' => 'CAD',
'USD' => 'USD'
]
]);
echo $this->Form->input('password', array(
'label' => __('Password'),
'placeholder' => __('Password'),
'value' => ''
));
echo $this->Form->input('confirm_password', array(
'label' => __('Confirm Password'),
'placeholder' => __('Confirm Password'),
'type' => 'password'
));
?>
</fieldset>
<?php
echo $this->Form->submit(__('Edit'));
echo $this->Form->end();
?>
这个问题是附加到表单的密码被散列,所以当我使用patchEntity时,它会再次被哈希,因为在实体User.php中这样:
protected function _setPassword($password) {
return (new DefaultPasswordHasher)->hash($password);
}
当我在控制器中设置$ user时,我也尝试过不抓密码。但是当我使用patchEntity时,它只是哈希值空白值。
也许我会以完全错误的方式解决这个问题,如果有人可以提供帮助,我只是在寻找解决这个问题的方向。
答案 0 :(得分:2)
如果您需要能够更改edit
表单中的密码,那么在没有提供数据的情况下,您必须确保它在被编组之前被删除
这可以使用Model.beforeMarshal
表类中的Users
事件来实现。
http://book.cakephp.org/3.0/en/orm/saving-data.html#before-marshal
public function beforeMarshal(Event $event, \ArrayObject $data, \ArrayObject $options)
{
if(isset($data['password']) && empty($data['password'])) {
unset($data['password']);
}
}
这是一个非常基本的例子,你可能想要添加一些更严格的检查,也许在测试空值之前删除空格等等。
您还可以将编辑配置文件数据和编辑凭据分隔为不同的操作/视图/表单,然后使用fieldList
选项限制可以编组的字段。
http://book.cakephp.org/3.0/en/orm/saving-data.html#avoiding-property-mass-assignment-attacks
编辑个人资料:
$this->Users->patchEntity($user, $this->request->data, [
'fieldList' => ['currency']
]);
修改凭据:
$this->Users->patchEntity($user, $this->request->data, [
'fieldList' => ['email', 'password']
]);