cambiar clave con LaravelLaravel 5 es genial y por eso incluye «out of the box» el módulo para recuperar contraseñas, el cual es imprescindible en la mayoría de los sistemas, pero ¿Qué pasa si el usuario no ha olvidado su contraseña, sino que simplemente quiere cambiarla?

La mayoría de los sistemas web incluyen la posibilidad de cambiar tu clave una vez que te has conectado a dicho sistema, pero por seguridad te pedirán que confirmes tu contraseña actual.

En este tutorial aprenderás cómo crear reglas personalizadas de validación con Laravel para crear la regla que te permitirá confirmar la clave actual del usuario.

Si ya has trabajado con Laravel 4, quizás estás acostumbrado a crear reglas de validación nuevas usando el método Validator::extend de esta manera:

Validator::extend('foo', function($attribute, $value, $parameters)
{
    return $value == 'foo';
});

En Laravel 5 esto sigue funcionando, y puedes colocarlo dentro del método «boot» de cualquier Service Provider. Pero la manera que me parece más correcta de agregar la regla extra, es extender la clase de Validación por completo.

Para ello crea esta clase dentro de tu carpeta app/. Puedes dejarla justo en app/ o crear un subdirectorio llamado «Core», «Support», «Validation» o lo que quieras, sólo recuerda que el nombre del directorio y del namespace deben coincidir dado que Laravel 5 usa PSR-4 para autocargar las clases:

<?php namespace NombreDeTuApp\Core;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Validator as LaravelValidator;

class Validator extends LaravelValidator {

    public function validateCurrentPassword($attribute, $value, $parameters)
    {
        return Hash::check($value, Auth::user()->clave);
    }

}

Nota: por supuesto no olvides cambiar el namespace.

Con esto ya tienes tu clase de validación personalizada, fíjate que incluí una nueva regla de validación para comprobar que la clave actual del usuario es correcta, esto, como ya comenté, es una medida común de seguridad, más que nada para prevenir que si el usuario dejó su cuenta abierta una tercera persona maliciosa no pueda cambiar la contraseña.

Nota también que Laravel nuevamente hace uso de convenciones (cumpliendo con el principio DRY): si quieres definir una nueva regla de validación esta llevará el prefijo «validate» y luego el nombre de la regla en formato CamelCase.

Lo segundo que necesitamos es registrar nuestra clase de validación y esto lo hacemos con un Service Provider, crea esta clase dentro de app/Providers/ValidatorServiceProvider.php:

<?php namespace NombreDeTuApp\Providers;

use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;

class ValidatorServiceProvider extends ServiceProvider {
    
    public function boot()
    {
        Validator::resolver(function($translator, $data, $rules, $messages)
        {
            return new \NombreDeTuApp\Core\Validator($translator, $data, $rules, $messages);
        });
    }

    public function register()
    {
    }

}

Una vez hecho esto tienes que registrar el Service Provider, esto se hace en el archivo config/app.php, busca el array llamado $providers y coloca al final el nombre completo de la clase (incluyendo el namespace):

'providers' => [
    // OTROS PROVIDERS VAN AQUI. NO LOS BORRES O ALGO MALO VA A PASAR
    // COLOCA TU PROVIDER AL FINAL:
    // PUEDES COLOCARLE UN COMENTARIO BONITO, ALGO COMO:
    /**
    *   ***MI APP PROVIDERS ***
    */
    'NombreDeTuApp\Providers\ValidatorServiceProvider'
];

¡Listo! Ya la nueva regla de validación está disponible. Ahora puedes definir un nuevo Form Request o validar con el método $this->validate dentro del controlador, como hemos visto ya en el curso de Laravel 5.

A mí me gustan los Form Requests así que yo creé el mío con lo siguiente:

<?php namespace NombreDeTuApp\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ChangePasswordRequest extends FormRequest
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'clave_actual' => 'required|min:6|current_password',
            'clave' => 'confirmed|min:6'
        ];
    }

    public function messages()
    {
        return [];
    }

    /**
     * Get the sanitized input for the request.
     *
     * @return array
     */
    public function sanitize()
    {
        return $this->only('clave');
    }

}

Acá la novedad es que tenemos una nueva regla llamada «current_password» (nota que es lo mismo que definimos en nuestro Validador pero sin el prefijo validate y el formato es con underscore en vez de camel case.

Si has seguido el curso de Laravel 5 seguramente ya sabrás como hacer uso de los Form Requests y sabrás cómo crear formularios en tus vistas así que dejo el resto del código en tus manos.


Esta es una nueva serie de artículos cortos o «tips» de Laravel 5 que surge generalmente de dudas entre los estudiantes del curso de Laravel 5 ¿Te parece útil o no? Por favor cuéntame en los comentarios.

Igualmente si encuentras útil el tip: ¡Compártelo por favor!

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.