Laravel 5.1 POST 与 ajax,得到错误。用 GET 做它并且它有效

Laravel 5.1 POST with ajax, get error. Do it with GET and it works

所以这是我的第一个 laravel 项目,我无法找出问题所在。

我搜索了几个小时,但没有任何帮助。

{!! csrf_field() !!}在我的表单中,发送了_token数据

路线:

Route::post('/posts/create', [
    'middleware' => 'auth',
    "as" => 'post-create',
    "uses"=>'PostsController@create'
]);

Ajax:

 $.ajax({
     url:'{{route('post-create')}}',
     type:'POST',
     data:form.serialize()
 });

Return 对于 ajax:

Remote Address:[::1]:80
Request URL:http://localhost/domain/public/posts/create
Request Method:POST
Status Code:500 Internal Server Error

TokenMismatchException in VerifyCsrfToken.php line 53:
in VerifyCsrfToken.php line 53
at VerifyCsrfToken->handle(object(Request), object(Closure))
at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 54
at ShareErrorsFromSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 62
at StartSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure))
at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure))
at call_user_func_array(array(object(EncryptCookies), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 42
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Kernel.php line 118
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 86
at Kernel->handle(object(Request)) in index.php line 54

并且 laravel 标准用户注册也不起作用。当登录时(两者都适用于 post)。

我错过了什么?

编辑:有趣的是,如果我使用提交按钮进行操作,它就会到达控制器。所以我发现问题出在控制器上:

$title=Input::post('title');

有'use Illuminate\Support\Facades\Input;'行

EDIT2:我猜 $title=Input::post('title'); 是问题所在。我应该使用 $request->input('title');

但我不知道如何正确使用它,我得到

Target [App\Http\Requests\Request] is not instantiable.

如果我将 'Request $request' 参数添加到控制器功能,则会出错。

这里的问题是 Laravel 看不到您的 csrf 令牌。首先使用

在元描述中设置它
<meta name="csrf-token" content="{{ csrf_token() }}">

然后在你的JQuery中使用

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
});

这应该可以解决您的问题

http://laravel.com/docs/5.1/routing#csrf-protection

在我的控制器中,我使用了“$title=Input::post('title');”而不是 '$request->input('title');'

我不得不提出请求 class,我提出了 App\Http\Requests\PostCreateRequest。

php artisan make:request PostCreateRequest

然后在控制器中

public function create(PostCreateRequest $request){
        print $request->input('title');
}

有效:)

你可以使用这个:
https://laravel.io/forum/11-14-2014-disabling-the-csrf-middleware-in-laravel-5

在此,您可以使用新的 class 替换 VerifyCsrfToken class.

来禁用给定路由的 csrf_token