【问题标题】:Unable to use conditional validation rules - Laravel无法使用条件验证规则 - Laravel
【发布时间】:2021-04-02 09:59:31
【问题描述】:

我直接绑定到模型属性。我无法提交表单,因为单个 livewire 组件中有两个表单。第一种是编辑用户,由nameemailrole组成,第二种是邀请用户,由email组成。

我无法提交表格,因为我在受保护的财产规则下结合了这两种表格的规则。因此,当我尝试使用第一个表单编辑用户时,它也会检查邀请表单中存在的 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');
}

【问题讨论】:

  • 您需要在编辑表单上添加一些额外的字段。因此,当您提交该表单时 - 检查这些字段是否存在,然后不要检查验证或您不想在保存功能上执行的任何内容。
  • @Tuhin 我该怎么做,你能帮我解决这个问题吗?
  • 在尝试使用 Laravel 构建应用程序之前,您可能想退后一步,先学习 PHP 的基础知识。只需查看rules() 方法的第一行,就可以将true 的值分配给变量$showUserManagementModal。如果你想进行比较,那是一个不同的运算符,它会失败,因为你没有在任何地方定义变量。您也没有在任何地方使用该方法。
  • 感谢@miken32 对它的启发,我已经默认将其声明为false。如果我正在编辑用户并在创建邀请时排除其他三个字段,如何进一步进行验证以排除该字段。
  • 当管理员尝试管理用户时,我将 $showUserManagementModal 的状态从 false 更改为 true。

标签: php laravel laravel-8 laravel-livewire


【解决方案1】:

您的 rules() 方法存在两个问题 - 一个是您正在检查局部变量(它不检查类的属性),其次您正在为变量分配值而不是比较(单个 @ 987654322@ 而不是双 ==)。

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',
        ];
}

【讨论】:

  • 它工作得很好,就在我尝试将电子邮件的唯一检查转移到 rules() 时,我收到以下错误,Typed property App\Http\Livewire\Backend\UserManagement\UserController::$user must not be accessed before initialization
猜你喜欢
  • 2020-12-23
  • 2020-05-25
  • 2020-10-24
  • 2016-06-03
  • 2018-07-04
  • 1970-01-01
  • 2017-07-08
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多