2016-12-10 7 views
0

私は初めてラージャー検証でajaxを使用していますが、それらを統合する方法にいくつかの問題があります。どのように私のlarvel検証コードを私のajaxと通信できますか?私は自分のjavascriptにいくつかのバリデーションルールを持っていますが、それぞれのルールはルールであり、どのようにララベルと統合できますか? 私のコードの例があります:AJAXを使用したIntegratin検証ルール

laravelコントローラ機能:

public function saveEmail(Request $request) 
    { 

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


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

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


     //Update Email with Sucess 
     $user->email = $request->email; 



    } 

Ajaxコード:

$(document).ready(function() { 

      $("#saveEmail").click(function (event) { 
       event.preventDefault(); 
       saveEmail(); 
      }); 

     }); 

function saveEmail() { 

      var email = $("#current_email").val(); 
      var new_email = $("#email").val(); 
      var password = $("#verify_password").val(); 
      var data = { current_email: email, email: new_email, verify_password: password } 
      $.ajax({ 
       url: "company/saveEmail')}}", 
       type: 'POST', 
       data: data, 
       success: function (result) { 
        if (result == 0) { 
        //Email saved correctlly 
        var text = 'E-mail actualizado'; 
        $('#saveOK').text(text); 
        $("#current_email").val(""); 
        $("#email").val(""); 
        $("#password").val(""); 
        $("#ErrorEmail").css({ "display": "none" }); 
        } 
        else if (result == 1) { 
        //"Incomplete data" 
        var error1 = 'The data are incomplete'; 
        $("#lbtxtEmailError").text(error1); 
        $("#ErrorEmail").css({ "display": "block" }); 
        } 
        else if (result == 2) { 
        //"Current email incorrect" 
        var error2 = 'Current email is incorrect'; 
        $("#lbtxtEmailError").text(error2); 
        $("#ErrorEmail").css({ "display": "block" }); 
        } 
        else if (result == 3) { 
        //"Incorrect format" 
        var error3 = 'The format is incorrect'; 
        $("#lbtxtEmailError").text(error3); 
        $("#ErrorEmail").css({ "display": "block" }); 
        } 
        else if (result == 4) { 
        //This email is already in use 
        var error4 = 'This email is already in use'; 
        $("#lbtxtEmailError").text(error4); 
        $("#ErrorEmail").css({ "display": "block" }); 
        } 
        else if (result == 5) { 
        //"Current password incorrect"; 
        var error5 = 'Your password is incorrect'; 
        $("#lbtxtEmailError").text(error5); 
        $("#ErrorEmail").css({ "display": "block" }); 
        } 
        else if (result == 6) { 
        //"This user doesnt exist" id 
        var error6 = 'User doesnt exist'; 
        $("#lbtxtEmailError").text(error6); 
        $("#ErrorEmail").css({ "display": "block" }); 
        } 
        else if (result == 7) { 
        //"New email already exist" 
        var error7 = 'New email alreadu exist '; 
        $("#lbtxtEmailError").text(error7); 
        $("#ErrorEmail").css({ "display": "block" }); 
        } 

       } 

      }) 
     } 

答えて

0

一つの正ネジリクエストとAjaxとの検証要求について作るために重要な区別リクエストは、失敗の場合にバリデータがどのように応答するかです。ドキュメントから、レスポンスの作成方法(失敗時):

受信リクエストがajaxリクエストの場合、リダイレクトは生成されません。その代わりに、422のステータスコードを持つHTTP応答が、検証エラーのJSON表現を含むブラウザに返されます。

422は素晴らしいことです。これは、約束のコールバック.error()内のエラーを観察できることを意味します。

$.ajax({ 
    //routes, urls, data, etc 
}).done(function(response){ 
    //this all worked well 
}).error(function(data){ 
    //walk the object for your data 
    console.warn(data); 
}); 

また、テイラーは約fat controllersを警告しています。可能であれば、抽象論理を使用しようとするべきです。代わりに、我々は適切なRequest

php artisan make:request SaveEmailRequest 

が続いApp\Http\Requests\SaveEmailRequestで私たちのファイルを開くとpublic function authorize()機能を見つけ行う必要があります。ここでは、ユーザーの電子メールやリクエストの電子メールの一致かどうかをチェックします:

/** 
* @returns boolean 
*/ 
public function authorize() 
{ 
    $flag = isset($this->current_email) && $this->current_email == auth()->user()->email); 
    $flag = Hash::check($this->verify_password, auth()->user()->password); 

    return $flag; 
} 

その後、我々は今、私たちの要求のpublic function rules()に私たちのルールを移動することができます。

/** 
* @return mixed 
*/ 
public function rules() 
{ 
    return [ 
     'current_email'  => 'required|email|exists:users,email,id,'. auth()->user()->id, 
     'email'    => 'required|email|unique:users', 
     'verify_password' => 'required' 
    ]; 
} 

は最後に我々だけで使用する必要がありますこれは私たちのコントローラで:

public function saveEmail(App\Http\Requests\SaveEmailRequest $request) 
{ 
    auth()->user()->update([ 
     'email' => $request->email 
    ]); 
} 

上記の情報は返されません。それは、私たちがする必要がないからです。応答は200として返され、約束の.done()機能に入ります。推測を心配する必要はありません。

どんな障害が発生した場合(ハッシュチェックは、電子メールが一致しない場合、パスワードが一致しない)、その後、422応答が返され、エラーメッセージが私たちの.error()方法のdata引数で見つけることができます。

うまくいけば、これが役に立ちます。

+0

本当に役に立ちました、最後の1つの質問は、Authorize関数で$ userまたは$ requestを認識できませんでしたが、変数saynsは未定義ですが、私はそれをauthorize関数の初めに作成する必要がありますか?すでに定義されていないとしますか?ごめんなさい。 – Pedro

+0

@Pedro喜んでそれは助け!私は答えを更新しました。 '$ user'は設定されておらず、コピー+貼り付けのためだけでした。それは 'auth() - > user()'でなければなりません。上記の編集をご覧ください。 – Ohgodwhy

+0

ありがとう、助けをたくさんありますが、私はまだ "$ request"変数で同じ問題を抱えています、私はAuthorize()Request $リクエストを入れる必要がありますか? – Pedro

関連する問題