如何编辑用户CakePHP 3

时间:2015-06-18 22:28:46

标签: cakephp cakephp-3.0

所以我一直在尝试在我的应用程序中使用编辑用户功能,我对如何使用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时,它只是哈希值空白值。

也许我会以完全错误的方式解决这个问题,如果有人可以提供帮助,我只是在寻找解决这个问题的方向。

1 个答案:

答案 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']
]);