2016-12-10 2 views
0

im использование в первый раз ajax с проверкой laravel, но у меня есть некоторые проблемы с тем, как интегрировать их с ними, как я могу сообщить свой код проверки laravel с помощью моего ajax? У меня есть в моем javascript некоторые правила проверки, где каждый номер является правилом, как я могу интегрировать его с моим laravel? Существует пример моего кода:Правила проверки целостности с помощью ajax

функция 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, перенаправление не будет сгенерировано. Вместо этого HTTP-запрос с кодом статуса 422 будет возвращен в браузер, содержащий JSON-представление ошибок проверки.

422 - это замечательно, потому что это означает, что мы можем наблюдать сбои в обратном вызове .

$.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 ответ будет возвращен, и сообщения об ошибках могут быть найдены в data аргумент нашего .error() метода.

Надеюсь, это поможет вам.

+0

спасибо, что ответ был действительно полезным, последний вопрос, в функции Авторизация, он не распознает $ user или $ request, является переменной sayns undefined, мне нужно создать ее для начала функции авторизации? Не предполагается ли уже определение? Извините за вопрос noob. – Pedro

+0

@Pedro Рад, что это помогло! Я обновил ответ, '$ user' не был установлен и был только из-за копии + вставки. Это должно быть 'auth() -> user()'. См. Изменение выше. – Ohgodwhy

+0

Большое спасибо за помощь, но у меня все еще такая же проблема с переменной «$ request», мне нужно ввести авторизацию() Request $ request? – Pedro