2016-12-09 2 views
0

Im создает страницу обновления, где пользователь может изменить свой адрес электронной почты, но для этого требуется подтверждение пароля. Но перед этим ему нужна какая-то проверка, прежде всего, чтобы проверить правильность текущего письма, а также если новое электронное письмо доступно для сохранения и после правильного пароля, чем обновление.Обновление и проверка поля электронной почты

Но у меня есть некоторые проблемы при оформлении запроса, проверка, может ли кто-нибудь сказать мне, если это правильно? (не помните, что 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"); 
+1

Не возражаете мне с просьбой this.' $ user-> validate' или '$ this-> validate'? –

+0

@KelvinKyaw $ this-> validate - правильный синтаксис. :) –

+1

Итак, где ваша функция 'validate()'? –

ответ

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. Прежде всего я заменил вашу проверку CURRENT_EMAILunique с exists. Зачем? Посмотрите here

  2. Метод, который я использовал здесь для проверки, называется Custom Validation. Подробнее here

Позвольте мне знать, если вы сталкиваетесь любые вопросы :)

0

У вас будет работа, но есть несколько вещей, которые я бы порекомендовал.

Во-первых, у вас уже есть $request, поэтому вы должны получить user. В то время как Auth::user() и $request->user() действительно возвращают то же самое, позже не потребуется использование фасада и, следовательно, немного быстрее.

Во-вторых, я бы подтвердил, прежде чем вы проверите тело запроса. Не имеет смысла тратить ресурсы на проверку $request, если пароль неверен.

В-третьих, вы можете поместить свой $user->email == $request->current_email в подтверждение с помощью правила exists. Это было бы что-то вроде "exists:users,email,id,$user->id".

Как вы показываете ошибки, зависит от того, как выполняется запрос. Взгляните на раздел Displaying Validation Errors для отправки формы и AJAX Requests and Validation для запросов AJAX.

Смежные вопросы