Pedro
Pedro

Reputation: 1477

Updating and Validating email field

Im creating a update page, where the user can change his email, but it needs a password confirmation for that. But before this, it needs some kind of validation, first to check if the current email is correct and also if the new email is available to be saved, and after the password is correct than be updated.

But im having some trouble in making the request, validation, can someone tell me if this is correct? (dont mind the dd i putted, is just for testing).

$user = Auth::user();
        $this->validate($request, array(
            'current_email'     => 'required|email|unique:users,email,'. $user->id,
            'email'             => 'required|email|unique:users',
            'verify_password'   => 'required|min:6'
        ));


        //Verify information user before updating
        if($user->email != $request->current_email){
            dd("Current Email is not the same");
        }

        if($user->password != bcrypt($request->verify_password)){
            dd("Password incorrect, will not update");
        }


        dd("update, is ok now");

Upvotes: 0

Views: 62

Answers (2)

prateekkathal
prateekkathal

Reputation: 3572

First write this in your console.

php artisan make:provider ValidationServiceProvider

Then replace your app\Providers\ValidationServiceProvider with

namespace App\Providers;

use Validator;
use Illuminate\Support\ServiceProvider;

class ValidationServiceProvider extends ServiceProvider
{
  /**
   * Bootstrap any application services.
   *
   * @return void
   */
  public function boot() {
    Validator::extend('old_password', function($attribute, $value, $parameters, $validator) {
      return auth()->validate([
        'email' => auth()->user()->email,
        'password' => $value
      ]);
    });
  }

  /**
   * Register the service provider.
   *
   * @return void
   */
  public function register() {
    //
  }
}

Now add it to providers in config\app.php, like

App\Providers\ValidationServiceProvider::class,

Now replace your method definition with

$user = auth()->user();

$validator = Validator::make($request, array(
              'current_email'     => 'required|email|exists:users,email,id,'. $user->id,
              'email'             => 'required|email|unique:users',
              'verify_password'   => 'required|min:6|old_password'
             ));

if($validator->fails()) {
  return redirect()->back()->withErrors($validator)->withInput();
}

dd("Good to go!!!");
  1. First of all I have replaced your current_email unique validation with exists. Why? Have a look here

  2. The method I have used here for validation is called Custom Validation. More details here

Let me know if you face any issues :)

Upvotes: 1

Jacob Lambert
Jacob Lambert

Reputation: 7679

What you have will work, but there are a couple of things that I would recommend.

First, you already have the $request, so you should get the user from that. While Auth::user() and $request->user() do return the same thing, the later will not require the use of a facade and therefore is a little quicker.

Second, I would validate the before you validate the request body. It doesn't make sense to spend the resources validating the $request if the password is not correct.

Third, you can put your $user->email == $request->current_email check in the validation using the exists rule. It would be something like "exists:users,email,id,$user->id".

How you display the errors will be up to how the request is being done. Take a look at the Displaying Validation Errors section for submitting a form and the AJAX Requests and Validation for AJAX requests.

Upvotes: 0

Related Questions