Agregar y modificar un campo en el form request validation de laravel 8

 Lavarel es uno de los framework de backen mas usado en el lenguaje PHP, algo que ya saben si están buscando  solución a este tipo de problemas.

Me encontré con este inconveniente y realicé las consultas necesarias para solucinarlos, espero que les pueda servir y ahorrarles tiempo.

Para ponerlos en contexto, tengo un formulario para registrar usuarios create.blade.php con los siguientes campos : dni, name, lastname, lastname2, email, password, status.

En mi controlador UserController.php en la función store escribí la lógica para guardar un usuario.

public function store(Request $request){
      
        $request->validate([
            'dni' => 'bail|required|numeric|digits:10',
            'name' => 'bail|required',
            'lastname' => 'bail|required',
            'lastname2' => 'bail|required',
            'email' => 'bail|required',
            'status' => 'bail|nullable'
        ]);

        $status = $request->filled('status');

        $user = new User();

        $user->dni = $request->dni;
        $user->name = $request->name;
        $user->lastname = $request->lastname;
        $user->lastname2 = $request->lastname2;
        $user->email = $request->email;
        $user->password = bcrypt($request->dni.$request->lastname);
        $user->status = $status;
        $user->save();

        return redirect('/users/create')->with('status''El usuario '.$user->name.' se ha registrado satisfactoriamente');
    }



utilice el método validate el cual recibe un array con las reglas de validaciones, la función filled para convertir el valor del checkbok del status a boolean, realicé una instancia del Modelo User y utilice el metodo save() de eloquent para registrar el usuario, y finalmente hice una redirección a la vista del formulario de registro de usuario create.blade.php con un mensaje enviado por un flahsession  confirmando el registro del usuario

Existe un método create de eloquent el cual recibe un array con clave y valor para guardar un usuario con una sola declaración de PHP. Antes de usar el metodo create, debes verificar si tienes llenas las propiedades fillable o guarded en el modelo.

Modelo User

protected $fillable = [
        'dni',
        'name',
        'lastname',
        'lastname2',
        'email',
        'password',
        'status',
    ];


Para simplificar el método de store del controlador, usé un form request validation de laravel que generalmente se utiliza para escenarios de validaciones mas complejos.










Este se crea en la carpeta app/http/request

Archivo SaveUserRequest.php

Encontramos dos funciones authorize() y rules().

La función authorize es como bien menciona la palabra , para verificación de permisos para  el usuario que desee realizar la acción, si tienes la logica en otro lugar debes colocarle true

public function authorize()
    {
        return true;
    }

En la función rules, colocamos un array con todas las reglas de validación que necesitemos:

public function rules()
    {
        return [
            'dni' => 'bail|required|numeric|digits:10|unique:App\Models\User,dni',
            'name' => 'bail|required',
            'lastname' => 'bail|required',
            'lastname2' => 'bail|required',
            'email' => 'bail|required|unique:App\Models\User,email',
            'status' => 'bail|nullable'
        ];
    }

Ahora para que funcione en nuestro controlador UserController.php , solo debemos llamarlo en nuestro método como un Request, y ya realizará la validación.

    public function store(SaveUserRequest $request){

Existe otro novedad, que al ver el nombre del campo este en el mensaje de erros , este se muestra en ingles tal cual como manejo los campos en la base de datos.




Para cambiar esto hay que agregar un método attributes  al SaveUserRequest. Esta información la encontramos en la documentación de laravel en Validation.









 public function attributes()
    {
        return [
            'dni' => 'Cedula',
            'email' => 'Correo electrónico',
            'name' => 'Nombres',
            'lastname' => 'Apellido paterno',
            'lastname2' => 'Apellido materno',
            'status' => 'Estado',
        ];
    }


Otras de las novedades es que se tiene que convertir en boolean el valor recibido de status, para ello agregue un método dentro de SaveUserRequest prepareForValidation el cual se aplica antes de aplicar las reglas de validación. Se utilizo el método merge que es una funcion de Request, la cual va a permitir pasar un array y cambiar o modificar le valor del campo status usando un función Helper filled para convertir un valor en boolean.

protected function prepareForValidation()
    {
        $this->merge([
            'status' => filled($this->status),
        ]);
    }

Para concluir con la lógica del método store para el registrar usuarios, se necesita agregar la contraseña al usuario, para lo cual definí que la clave inicial se formará por la unión del campo dni y el campo lastname. Para lo cual utilicé un metodo del helper para agregar datos a un array y objetos Arr::add . Finalmente el controlador terminó de la siguiente manera.

public function store(SaveUserRequest $request){

        $registerUser = Arr::add($request->validated(),'password',bcrypt($request->dni.$request->lastname));
        User::create($registerUser);
        return redirect('/users/create')->with('status''El usuario '.$request->name.' se ha registrado satisfactoriamente');
    }

Si tienes alguna consulta o recomendación, hazlo en la sección de comentario.

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