Невозможно использовать правила условной проверки — Laravel

Я привязываюсь непосредственно к свойству модели. Я не могу отправить форму, так как в одном компоненте livewire есть две формы. 1-я форма предназначена для редактирования пользователя, состоящего из name, email, role, а 2-я форма предназначена для приглашения пользователя, состоящего из email.

Я не могу отправить форму, так как я совместно изложил правила для обеих форм в соответствии с правилами защищенной собственности. Поэтому, когда я пытаюсь отредактировать пользователя, используя первую форму, он также проверяет поле email, которое присутствует в форме приглашения. Как я могу заставить его работать в этой структуре.

  • Приложение\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');
}

person ToxifiedHashkey    schedule 23.12.2020    source источник
comment
Вам нужно добавить несколько дополнительных полей в форму редактирования. Итак, когда вы отправляете эту форму - проверьте, существуют ли эти поля, а затем не проверяйте проверку или что-то еще, что вы не хотите выполнять в своей функции сохранения.   -  person Tuhin    schedule 23.12.2020
comment
@Tuhin Как мне поступить, не могли бы вы помочь мне с этим?   -  person ToxifiedHashkey    schedule 23.12.2020
comment
Прежде чем пытаться создать приложение с помощью Laravel, вы можете сделать шаг назад и сначала изучить основы PHP. Просто взглянув на первую строку вашего метода rules(), вы присваиваете значение true переменной $showUserManagementModal. Если бы вы хотели сделать сравнение, это был бы другой оператор, и он потерпел бы неудачу, потому что вы нигде не определили переменную. Вы также нигде не используете этот метод.   -  person miken32    schedule 23.12.2020
comment
Спасибо, что пролили свет на это @miken32, я уже объявил это ложным по умолчанию. Как я могу дополнительно выполнить проверку, чтобы исключить поле, если я редактирую пользователя, и исключить три других поля, когда я создаю приглашение.   -  person ToxifiedHashkey    schedule 23.12.2020
comment
И я меняю состояние $showUserManagementModal с false на true, когда администратор пытается управлять пользователем.   -  person ToxifiedHashkey    schedule 23.12.2020


Ответы (1)


Есть две проблемы с вашим методом rules(): одна из них заключается в том, что вы проверяете локальную переменную (она не проверяет свойство класса), а во-вторых, вы присваиваете значения переменной вместо сравнения (одиночное = вместо двойного ==) .

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',
        ];
}
person Qirel    schedule 23.12.2020
comment
Он работает отлично, просто когда я пытаюсь переместить уникальную проверку электронной почты в правила(), я получаю следующую ошибку: Typed property App\Http\Livewire\Backend\UserManagement\UserController::$user must not be accessed before initialization - person ToxifiedHashkey; 24.12.2020