无法使用条件验证规则 - Laravel
Unable to use conditional validation rules - Laravel
我直接绑定到模型 属性。我无法提交表单,因为单个 livewire 组件中有两个表单。第一种形式是编辑用户,由name
、email
、role
组成,第二种形式是邀请用户,由email
.[=组成。 17=]
我无法提交表格,因为我已经根据受保护的规则 属性 对两种表格的规则进行了综合说明。因此,每当我尝试使用第一个表单编辑用户时,它也会检查 email
字段,该字段存在于邀请表单中。我怎样才能让它在这个结构中工作。
- App\Http\Livewire\UserController.php
public $showUserManagementModal = false;
public $showUserInvitationModal = false;
public User $user;
public Invitation $invitation;
protected function rules() {
if ($showUserManagementModal = true)
return [
'user.name' => 'required | string | max:255',
'user.email' => 'required | string | email | max:255',
'role' => 'required',
];
if ($showUserInvitationModal = true)
return [
'invitation.email' => 'required | string | email | max:255 | unique:invitations,email',
];
}
public function createInvitation() {
$this -> useCachedRows();
$this -> resetValidation();
$this -> invitation = new Invitation();
$this -> showUserInvitationModal = true;
}
public function saveInvitation() {
$this -> validate();
$this -> invitation -> generateInvitationToken();
$this -> invitation -> save();
$this -> showUserInvitationModal = false;
}
public function manageUser(User $user) {
$this -> useCachedRows();
$this -> resetValidation();
$this -> user = $user;
$this -> role = $user -> roles -> pluck('id');
$this -> showUserManagementModal = true;
}
public function saveUser() {
$this -> validate();
$this -> validate([
'user.email' => 'unique:users,email,'.$this -> user -> id,
]);
$this -> user -> roles() -> sync($this -> role);
$this -> user -> save();
$this -> showUserManagementModal = false;
$this -> dispatchBrowserEvent('notify', $this -> user -> name.' Updated Successfully');
}
您的 rules()
方法有两个问题 - 一个是您正在检查局部变量(它不检查 class 的 属性),其次您'重新为变量赋值而不是比较(单 =
而不是双 ==
)。
protected function rules() {
if ($this->showUserManagementModal === true)
return [
'user.name' => 'required|string|max:255',
'user.email' => 'required|string|email|max:255',
'role' => 'required',
];
if ($this->showUserInvitationModal === true)
return [
'invitation.email' => 'required|string|email|max:255|unique:invitations,email',
];
}
您还应该将电子邮件的唯一检查移至 rules()
方法,而不是在 saveUser()
方法中明确检查。
protected function rules() {
if ($this->showUserManagementModal === true)
return [
'user.name' => 'required|string|max:255',
'user.email' => 'required|string|email|max:255|unique:users,email'.($this->user->id ? ','.$this->user->id : ''),
'role' => 'required',
];
if ($this->showUserInvitationModal === true)
return [
'invitation.email' => 'required|string|email|max:255|unique:invitations,email',
];
}
我直接绑定到模型 属性。我无法提交表单,因为单个 livewire 组件中有两个表单。第一种形式是编辑用户,由name
、email
、role
组成,第二种形式是邀请用户,由email
.[=组成。 17=]
我无法提交表格,因为我已经根据受保护的规则 属性 对两种表格的规则进行了综合说明。因此,每当我尝试使用第一个表单编辑用户时,它也会检查 email
字段,该字段存在于邀请表单中。我怎样才能让它在这个结构中工作。
- App\Http\Livewire\UserController.php
public $showUserManagementModal = false;
public $showUserInvitationModal = false;
public User $user;
public Invitation $invitation;
protected function rules() {
if ($showUserManagementModal = true)
return [
'user.name' => 'required | string | max:255',
'user.email' => 'required | string | email | max:255',
'role' => 'required',
];
if ($showUserInvitationModal = true)
return [
'invitation.email' => 'required | string | email | max:255 | unique:invitations,email',
];
}
public function createInvitation() {
$this -> useCachedRows();
$this -> resetValidation();
$this -> invitation = new Invitation();
$this -> showUserInvitationModal = true;
}
public function saveInvitation() {
$this -> validate();
$this -> invitation -> generateInvitationToken();
$this -> invitation -> save();
$this -> showUserInvitationModal = false;
}
public function manageUser(User $user) {
$this -> useCachedRows();
$this -> resetValidation();
$this -> user = $user;
$this -> role = $user -> roles -> pluck('id');
$this -> showUserManagementModal = true;
}
public function saveUser() {
$this -> validate();
$this -> validate([
'user.email' => 'unique:users,email,'.$this -> user -> id,
]);
$this -> user -> roles() -> sync($this -> role);
$this -> user -> save();
$this -> showUserManagementModal = false;
$this -> dispatchBrowserEvent('notify', $this -> user -> name.' Updated Successfully');
}
您的 rules()
方法有两个问题 - 一个是您正在检查局部变量(它不检查 class 的 属性),其次您'重新为变量赋值而不是比较(单 =
而不是双 ==
)。
protected function rules() {
if ($this->showUserManagementModal === true)
return [
'user.name' => 'required|string|max:255',
'user.email' => 'required|string|email|max:255',
'role' => 'required',
];
if ($this->showUserInvitationModal === true)
return [
'invitation.email' => 'required|string|email|max:255|unique:invitations,email',
];
}
您还应该将电子邮件的唯一检查移至 rules()
方法,而不是在 saveUser()
方法中明确检查。
protected function rules() {
if ($this->showUserManagementModal === true)
return [
'user.name' => 'required|string|max:255',
'user.email' => 'required|string|email|max:255|unique:users,email'.($this->user->id ? ','.$this->user->id : ''),
'role' => 'required',
];
if ($this->showUserInvitationModal === true)
return [
'invitation.email' => 'required|string|email|max:255|unique:invitations,email',
];
}