2015-08-25 6 views
3

Я пытаюсь опубликовать данные, используя ajax в laravel, но, похоже, не работает. Я следовал за следующий мой кодAjax Post не работает в laravel 5.1

login.blade.php

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<meta name="csrf_token" content="{{ csrf_token() }}" /> 

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 
<style type="text/css"> 

</style> 
<script type="text/javascript"> 
$(document).ready(function(){ 
    $('.send-btn').click(function(){ 
    console.log($('input[name=email]').val()); 
    $.ajax({ 
     url: 'login', 
     type: "post", 
     data: {'email':$('input[name=email]').val(), '_token': $('input[name=_token]').val()}, 
     success: function(data){ 
     console.log($('input[name=email]').val()); 
     alert(data); 
     } 
    });  
    }); 


}); 
</script> 
</head> 
<body> 
<div class="secure">Secure Login form</div> 
{!! Form::open(array('url'=>'account/login','method'=>'POST', 'id'=>'myform')) !!} 
<div class="control-group"> 
    <div class="controls"> 
    {!! Form::text('email','',array('id'=>'','class'=>'form-control span6','placeholder' => 'Email')) !!} 
    </div> 
</div> 
<div class="control-group"> 
    <div class="controls"> 

    </div> 
</div> 
{!! Form::button('Login', array('class'=>'send-btn')) !!} 
{!! Form::close() !!} 
</body> 
</html>          

и route.php

Route::get('account/login', function() { 
    return View::make('login'); 
}); 
Route::post('account/login', '[email protected]'); 

и контроллер

public function login() { 
    // Getting all post data 
    if(!Request::ajax()) { 
     $data = Input::all(); 
     print_r($data); 
    } 

    } 

Всякий раз, когда я пытаюсь отправить форму не работает. Я попытался использовать оповещение в onclick jquery, но он показывает предупреждение. Может ли кто-нибудь сказать, почему он не работает?

Примечание: Этот вопрос уже задавали, но не нашел ответ полезным для меня

Laravel 5.1 ajax not working?

Update

<script type="text/javascript"> 
$(document).ready(function(){ 
    $('.send-btn').click(function(){ 
    console.log($('input[name=email]').val()); 
    $.ajax({ 
     url: 'login', 
     type: "post", 

     data: {'email':$('input[name=email]').val(), '_token': $('input[name=_token]').val(),'_method': 'POST'}, 
     success: function(data){ 
     console.log($('input[name=email]').val()); 
     alert(data); 
     } 
    });  
    }); 


}); 
</script> 

В безопасности консоли я получаю следующее сообщение об ошибке

[HTTP/1.0 500 Internal Server Error 115ms] 


Update 2 


<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="UTF-8"> 
<meta name="csrf_token" content="{{ csrf_token() }}"> 

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 
<style type="text/css"> 

</style> 

<script> 
$(document).ready(function() { 
    $('#frm').on('submit', function (e) { 
    alert(); 
     e.preventDefault(); 
     var title = $('#title').val(); 
     var body = $('#body').val(); 
     var published_at = $('#published_at').val(); 
     $.ajax({ 
      type: "POST", 
      url: 'http://localhost/demo/public/articles/articles', 
      headers: { 
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
     }, 
      dataType: 'JSON', 
      data: {title: title, body: body, published_at: published_at}, 
      success: function(data) { 
       $("#ajaxResponse").append(data.msg); 
       alert(data); 
      } 
     }); 
    }); 
    }); 
</script> 
</head> 
<body> 

{!! Form::open(['url' => 'articles', 'id' => 'frm']) !!} 
    <p> 
     {!! Form::label('title', 'Title:') !!} 
     {!! Form::text('title') !!} 
    </p> 

    <p> 
     {!! Form::label('body', 'Body:') !!} 
     {!! Form::textarea('body') !!} 
    </p> 

    <p> 
     {!! Form::label('published_at', 'Date:') !!} 
     {!! Form::input('date', 'published_at', date('Y-m-d'), ['class' => 'form-control']) !!} 
    </p> 

    <p> 
     {!! Form::submit('Submit Article', ['id' => 'submit']) !!} 
    </p> 
{!! Form::close() !!} 

</body> 
</html> 

route.php

Route::resource('articles', 'ArticlesController'); 

Статья Контроллер

public function store() 
    { 
     print_r(Request::all()); 

    } 

enter image description here

Обновление 2

[2015-08-28 06:23:03] 

local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php:53 
Stack trace: 
#0 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#1 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) 
#2 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(54): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#3 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#4 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) 
#5 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#6 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#7 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) 
#8 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#9 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#10 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) 
#11 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#12 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#13 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) 
#14 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(42): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#15 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) 
#16 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) 
#17 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) 
#18 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request)) 
#19 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(122): Illuminate\Pipeline\Pipeline->then(Object(Closure)) 
#20 D:\xampp\htdocs\demo\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(87): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) 
#21 D:\xampp\htdocs\demo\public\index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) 
#22 {main} 
+0

«Всякий раз, когда я пытаюсь отправить форму не работает» - это говорит нам очень мало. Что не работает? Используйте инструменты разработчика (вкладка «Консоль» и «Сеть») в вашем браузере.Выполняется ли функция? Есть ли ошибки? Получается ли запрос? Отформатирован ли он так, как вы ожидаете? Получили ли вы ответ? Ответ отформатирован так, как вы ожидаете? Если вы сделаете запрос к конечной точке HTTP вручную, это сработает? Можете ли вы сузить проблему до JS или PHP? – Quentin

+0

@tester, что говорят журналы об этой ошибке? – manix

+0

также, измените 'url: 'http: // localhost/demo/public/articles/articles'' и установите его в' url:' http: // localhost/demo/public/articles ', ' – manix

ответ

2

Форма отлично работает.

Вы просто забыли отправить "_method": "post" в свои данные формы ajax. Laravel использует маршрутизацию Symfony, которая использует специальный параметр _ метод, чтобы проехать к вашему маршруту.

+0

Это необязательно. Заголовок AJAX уже отправляет метод POST с использованием параметра 'type' – manix

1

Я замечаю пару вещей сразу с места в карьер. Прежде всего, вы установили свой маршрут POST (в routes.php) на «account/login», но вы устанавливаете URL-адрес .ajax для «входа». Вам нужно установить его на «/ account/login», как и у вас в своем URL-адресе и, что самое главное, в файле маршрутов.

Кроме того, поскольку вы используете Laravel {!! Form :: xxx() !!}, вам не нужно включать 'method' => 'POST'. Это будет добавлено автоматически, как и токен CSRF. http://laravelcollective.com/docs/5.0/html#opening-a-form

Кроме того, функция «Войти» в вашем контроллере работает только если запрос не AJAX, но вы пытаетесь отправить через запрос AJAX, правильно? Всего несколько вещей, чтобы вникать. Надеюсь, поможет.

+0

@ DonnaJo.i имеет опечатку error.my URL-адрес правильный даже истребитель http://stackoverflow.com/questions/32256969/laravel-5-ajax-post-500-internal- server-error в этом примере, но с той же ошибкой – vision

+0

, если я удалю скрипт, тогда он отправит форму. i обновит мой новый пример в моем вопросе – vision

2

То, что я вижу, это неправильно URL называется в Ajax определению, должно быть:

url: 'http://localhost/demo/public/articles', 

URL-адрес выше следует хранить статью. Для последующей авторизации следует использовать:

url: 'http://localhost/demo/public/login', 

Как примечание, если ваш сайт будет изменить домен URL, можно инициализировать URL с помощью JavaScript в заголовке:

<script> 
    var login_url = '{{ url("login") }}'; 
</script> 

Тогда можно назвать as:

$.ajax({ 
     type: "POST", 
     url: login_url, 
1

Как вы можете видеть из исключения, у вас возникла проблема с токеном CSRF. Так почему-то вы не можете отправить токен, вот что вы должны отслеживать.

В первоначальном вопросе до обновления, вы посылаете маркер из скрытого элемента формы, как: '_token': $('input[name=_token]').val()

Form::open предполагается добавить поле в форме, но, вероятно, была проблема так я d советую просмотреть источник страницы, чтобы убедиться, что есть скрытый элемент формы, такой как <input type="hidden" name="_token" value="asdfasfd">.

И/или вы можете просто ввести $('input[name=_token]').val() в консоли своего браузера, чтобы убедиться, что вы можете достичь значения.


После «обновления 2» вы решили переместить маркер CSRF в мета-тег и отправить его с заголовками, но название мета является csrf_token однако вы ссылаться на него в опциях $ .ajax в csrf-token (используется тире вместо подчеркивания).


Для обоих случаев, лучший способ отследить проблему эффективно с помощью браузеров консоли:

  • Когда вы видите ошибку в консоли, просто нажмите на ссылку и его» Перейдем на вкладку «Сеть».
  • Вы увидите все запросы там, найдите свой запрос, посмотрев имя и нажмите его. (Он должен быть выделен на мгновение, но иногда он не отображается, поэтому вам может потребоваться прокрутка вверх или вниз, чтобы найти его).
  • На правой стороне нажмите вкладку «заголовки» и прокрутите вниз, чтобы увидеть поле _token -or- X-CSRF-TOKEN, и если они пусты или нет.
  • Другой наконечник, нажмите на кнопку «ответ» или на вкладке «Предварительный просмотр», чтобы увидеть ответ сервера, это быстрее обнаружить ошибку, что путь вместо того, чтобы идти в журналы и т.д.
0

Я думаю, что проблема находится в App/Http/Middleware/Authenticate.php Попробуйте изменить этот

public function handle($request, Closure $next) 
{ 
    if ($this->auth->guest()) 
    { 
     if ($request->ajax()) 
     { 
      return response('Unauthorized.', 401); 
     } 
     else 
     { 
      return redirect()->guest('auth/login'); 
     } 
    } 

    return $next($request); 
} 

к этому:

public function handle($request, Closure $next) 
{ 
    return $next($request); 
} 
Смежные вопросы