правила сборки cakephp 3, которые позволяют проверять уникальность данных и позволяют

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

public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['username']));
$rules->add($rules->isUnique(['email']));
$rules->add($rules->isUnique(['phone']));
return $rules;
}

Как я могу исправить это?
Я уже пробовал -> allowEmpty в проверке, но он не работает.
В документах ничего об этом нет. Как конкретно, как это.

0

Решение

Чтобы улучшить ответ божественного человека, вы должны сделать это в User Entity

//Entity/User.php

protected function _setPhone($value)
{
if($value == '') {
$value = null;
}

return $value;
}
2

Другие решения

Если вы до сих пор не нашли решения для этого, у меня есть одно.
Сегодня я столкнулся с той же проблемой и обнаружил, что пустые поля имеют значение », которое не равно нулю.
Итак, что вы должны сделать, в функции add () и edit (), или любой другой функции, которую вы используете для записи телефона в базу данных, вы должны проверить, равно ли поле телефона ». Если это так, тогда просто присвойте ему значение null.
Например:

public function add()
{
//todo: check for conflicting email and phone

$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data);

//LOOK AT THESE TWO LINES
if($user->phone == '') {
$user->phone = null;
}

if ($this->Users->save($user)) {
$this->Flash->success(__('The user has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('The user could not be saved. Please, try again.'));
}
}
$roles = $this->Users->Roles->find('list', ['limit' => 200]);
$this->set(compact('user', 'roles'));
$this->set('_serialize', ['user']);
}
0