2016-12-09 6 views
0

更新ページを作成します。ユーザーは電子メールを変更できますが、パスワード確認が必要です。しかし、これに先立ち、現在の電子メールが正しいかどうか、新しい電子メールが保存可能かどうか、パスワードが正しいかどうかを確認するなどの検証が必要です。電子メールフィールドの更新と妥当性確認

しかし、私はこれが正しいかどうかを誰かに教えてもらえますか? (私はパットした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 

そして、今すぐ

$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!!!"); 
であなたのメソッドの定義を置き換える

App\Providers\ValidationServiceProvider::class, 

のように、config\app.phpプロバイダに追加

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

であなたのapp\Providers\ValidationServiceProviderを置き換えます

  1. 私はexistsであなたのunique CURRENT_EMAIL検証を交換しているまず第一に。どうして?ありがとうございましたhere

  2. ここで検証に使用した方法はカスタム検証と呼ばれています。詳細here

あなたはすべての問題に直面した場合、私に教えてください:)

0

あなたが持っているものは動作しますが、私が推奨するものがいくつかあります。

まず、$requestがあるので、userを取得する必要があります。 Auth::user()$request->user()は同じものを返しますが、後でファサードの使用を必要としないため、少し早くなります。

第2に、リクエスト本体を検証する前に検証します。パスワードが正しくない場合、$requestを検証するリソースを費やすことは意味がありません。

第3に、ルールを使用して$user->email == $request->current_emailのチェックを有効にすることができます。それは"exists:users,email,id,$user->id"のようなものです。

エラーをどのように表示するかは、要求の実行方法によって決まります。フォームを送信する場合はDisplaying Validation Errorsのセクションを、AJAXリクエストの場合はAJAX Requests and Validationをご覧ください。

関連する問題