更新和验证电子邮件字段

时间:2016-12-09 01:06:39

标签: laravel laravel-5 laravel-5.2

我正在创建一个更新页面,用户可以在其中更改其电子邮件,但需要密码确认。但在此之前,它需要某种验证,首先检查当前的电子邮件是否正确,以及新电子邮件是否可以保存,以及密码是否正确而不是更新。

但是我在提出请求,验证方面遇到了一些麻烦,有人可以告诉我这是否正确? (不介意我推出的dd,仅用于测试)。

$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");

2 个答案:

答案 0 :(得分:1)

首先在你的控制台中写这个。

php artisan make:provider ValidationServiceProvider

然后将您的app\Providers\ValidationServiceProvider替换为

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() {
    //
  }
}

现在将其添加到config\app.php中的提供商,例如

App\Providers\ValidationServiceProvider::class,

现在用

替换你的方法定义
$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. 首先,我已将{strong> current_email unique验证替换为exists。为什么?看看here

  2. 我在此处用于验证的方法称为自定义验证。更多详情here

  3. 如果您遇到任何问题,请告诉我们。)

答案 1 :(得分:0)

你有什么工作,但我会推荐几件事。

首先,您已经拥有$request,因此您应该从中获得user。虽然Auth::user()$request->user()确实返回相同的内容,但后者不需要使用外观,因此更快一些。

其次,在验证请求正文之前,我会验证它。如果密码不正确,花费验证$request的资源是没有意义的。

第三,您可以使用exists规则将$user->email == $request->current_email检查置于验证中。它就像"exists:users,email,id,$user->id"

如何显示错误将取决于请求的执行方式。请查看提交表单的Displaying Validation Errors部分和AJAX请求的AJAX Requests and Validation