Usando la funcion prepareForValidation del FormRequest de laravel 8 para cambiar el la redirección de la validación

 Saludos.

Para ponerlos en contexto, estoy creando un pequeño formulario para la creación de usuarios, nada del otro mundo.




Para poder crear un usuario(users), primero se debe seleccionar a una persona, para lo cual usé un modal, en donde se carga una tabla los datos de la personas(people_entities). Una de las validaciones en el formrequest es que sea requerido seleccionar a una persona.

A continuación las reglas:

public function rules()
    {
        return [
            'name' => 'bail|required|alpha_dash|unique:App\Models\User,name',
            'email' => 'bail|required|unique:App\Models\User,email',
            'status' => 'bail|required',
            'password' => ['required''confirmed'Password::min(8)
            ->letters()
            ->mixedCase()
            ->numbers()
            ->symbols()
            ->uncompromised()],
            'people_entities_id' => 'bail|required'
        ];
    }


Una vez realiza la validación esta redireccionara al mismo formulario, para lo cual necesitaba que se cargara automáticamente los datos de la persona seleccionada.

Hice una modificación en la ruta para que carga el formulario de creación de usuario.


Antes

Route::get('/users/create', [UserController::class'create'])->name('users.create')->middleware('auth');

Despues

Route::get('/users/create/{id?}', [UserController::class'create'])->name('users.create')->middleware('auth');

Le agregue un parámetro opcional, que vendrá a ser el id de la persona, y en el controlador cargar y enviar la vista los datos de la persona.

public function create($id = null){
        if($id != null){
            $PersonEntityData = PersonEntity::with(['Countries','provinces','cantons','parishes'])->where('id'$id)->first();
        }else{
            $PersonEntityData = new PersonEntity();
        }

        $user = new User();
        $roles = Role::pluck('name','id');
        return view('configuracion.userCreate',compact('user','roles','PersonEntityData'));
    }

Hasta todo bien , pero falta que después de validar la url tenga el id persona como parametro.

Aquí es donde interviene la función prepareForValidation.

Antes de configurar la función, vamos a sobre escribir el parámetro $redirect de la clase extendida formrequest, que es el parámetro que permite configurar la URI al que se redireccionara si falla la validación. Y creamos una variable $person_id

protected $redirect = 'admin/user/create';
    public $person_id = null;

En la función prepareForValidation hacemos la validación, si existe un campo people_entities_id y contiene un valor diferente de null, entonces le asignara ese valor a la variable person_id y modificara la variable redirect. Caso contrario dejara la variable tal como esta.

protected function prepareForValidation()
    {
        if($this->people_entities_id != null){
            $this->person_id = $this->people_entities_id;
            $this->redirect = url('admin/users/create/'.$this->person_id);
        }else{
            $this->redirect = url('admin/users/create');
        }

    }

Y este el resultado


Espero les sirva, les comente que pase horas buscando una posible solución en internet, al final revise la documentación y encontré lo que buscaba. Una buena documentación ayuda muchísimo. Si tienen alguna consulta, comentario o surgencia con gusto responderé, hasta la próxima.

Comentarios

Entradas más populares de este blog

USO DE DBLINK EN FUNCIONES DE POSTGRESQL(PARTE UNO)

PASAR UN ARRAY COMO PARAMETRO A UNA FUNCION DE POSTGRESQL (PARTE UNO)

Codeigniter solucion de :A PHP Error was encountered