Ошибка Acl (ARO) при создании пользователя
-
24-12-2019 - |
Вопрос
Я пытаюсь сохранить пользователя, но при сохранении получаю следующую ошибку
Aclnode :: node () - не удалось найти ARO Node, идентифицированный "Array ([aro0.model] => Роль [aro0.foreign_key] =>)"
у меня тоже такая ошибка вверху
Неопределенный индекс:role_id [CORE\Cake\Model\AclNode.php, строка 140]
Я не знаю, что делать, потому что когда я добавлял роли, они с легкостью добавляли их в aros, так почему теперь у меня возникают проблемы?
Я следовал руководству, предоставленному
что должно быть просто, но кажется, что это не так просто.
в Роль Модель
public $primaryKey = 'role_id';
public $displayField = 'role';
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
return null;
}
в Пользователь Модель
public $primaryKey = 'user_id';
public $displayField = 'username';
public function beforeSave($options = array()) {
$this->data['User']['password'] = AuthComponent::password(
$this->data['User']['password']
);
return true;
}
public $hasMany = array(
'Role' => array(
'className' => 'Role',
'foreignKey' => 'role_id'
)
);
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
if (!$this->id && empty($this->data)) {
return null;
}
if (isset($this->data['User']['role_id'])) {
$roleId = $this->data['User']['role_id'];
} else {
$roleId = $this->field('role_id');
}
if (!$roleId) {
return null;
} else {
return array('Role' => array('id' => $roleId));
}
}
Мой код сохранения для Пользователь
public function add() {
//Populate roles dropdownlist
$data = $this->User->Role->find('list', array('fields' => array('role_id', 'role')));
$this->set('roles', $data);
if ($this->request->is('post')) {
$this->User->ContactDetail->create();
$this->User->ContactDetail->save($this->request->data);
$this->request->data['User']['contact_detail_id'] = $this->User->ContactDetail->id;
$this->User->Create();
if ($this->User->save($this->request->data)) {
$this->Session->setFlash(__('The user has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
}
}
Решение
Я согласен с Джимми, тебе следует изменить отношение к $belongsTo
.Когда вы сохраняете пользователя, он также пытается сохранить таблицу aros, поэтому вам необходимо внести некоторые изменения, если вы не хотите, чтобы пользователь сохранялся в aros, для сохранения таблицы aros достаточно только роли (это также объясняется в руководстве). , поэтому посмотрите, какие изменения я внес в эти две модели.
Образец для подражания должен быть:
...
public $hasMany = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'role_id',
)
);
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode() {
return null;
}
...
Модель пользователя должна быть:
...
public $belongsTo = array(
'Role' => array(
'className' => 'Role',
'foreignKey' => 'role_id',
)
);
public function bindNode($user) {
return array('model' => 'Role', 'foreign_key' => $user['User']['role_id']);
}
...
Как показано в приведенном выше коде, public $actsAs = array('Acl' => array('type' => 'requester'));
должно быть только в ролевой модели, см. отношения, которые я добавил, а также изменения в функциях родительского узла и связывания.
Попробуйте это и свяжитесь со мной, если что-нибудь будет.
Надеюсь, поможет
Другие советы
На основе вашего parentNode()
методы, я предполагаю, что вам следует изменить отношения в модели пользователя следующим образом:
public $belongsTo = array('Role');
Также убедитесь, что $this->request->data['User'] правильно содержит поле role_id при вызове $this->User->save($this->request->data) в действии добавления.
И небольшое изменение:Используйте строчную букву «c» в $this->User->Create();
:
$this->User->create();