Laravel 5.2 令牌不匹配

Laravel 5.2 token mismatch

我正在将 Laravel 5.1 站点更新为 Laravel 5.2.39。我在 "approved" 升级过程(尤其是中间件)中遇到了很多问题,所以我最终创建了一个新的 Laravel 5.2 站点,并从旧站点转移了我的视图、模型和控制器。它似乎有效,除非我提交任何表格时出现令牌不匹配异常:

TokenMismatchException in VerifyCsrfToken.php line 67:

我的表单中有令牌(使用 {{ csrf_field() }}):

<div class="form-group">
    {!! Form::label('name', 'Name') !!}
    {!! Form::text('name', old('name'), ['placeholder' => 'Name', 'class' => 'form-control']) !!}
</div>
<div class="form-group">
    {!! Form::label('email', 'Email') !!}
    {!! Form::email('email', old('email'), ['placeholder' => 'Email', 'class' => 'form-control']) !!}
</div>
<div class="form-group">
    {!! Form::label('phone', 'Phone') !!}
    {!! Form::text('phone', old('phone'), ['placeholder' => 'Phone', 'class' => 'form-control']) !!}
</div>
{{ csrf_field() }}
<div class="form-group">
    {!! Form::submit('Submit', ['class' => 'btn btn-default btn-small']) !!}
    <input type="reset" class="btn btn-primary btn-small" />
</div>

并且我已经清除了我的 cookie,还尝试将 config/session.php lifetime 设置为更高的数字以确保它不会超时。

这是 运行 在宅基地盒子上。

有什么想法可以尝试吗?

编辑:这是有问题的路线

Route::resource('contact', 'ContactController');

EDIT2:这是路由文件。我不认为需要在 Laravel 5.2 中将路由包装在网络中间件中——但是,我已经尝试了两种方法,但都出现了同样的错误。

Route::group(['middleware' => ['web']], function () {

    Route::get('/', 'AccountController@index');

    Route::resource('account', 'AccountController');
    Route::resource('contact', 'ContactController');

});

在控制器的创建操作中转储 $request->session()->token() 会在带有表单的页面上显示当前会话令牌。这与添加到表单的标记相同(已查看源代码)。

但是当它到达 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::tokensMatch() class 时,我转储了会话令牌,它与表单令牌不同——这意味着它们永远不会匹配。不确定这里会发生什么。

只要您有 Form:open 声明,就不再需要单独的 csrf_field 行。 Form::open 应该处理一下。

您使用的是 laravel 集体表格包吗?不再维护旧的 illuminate 包。

正如之前的用户所说,所有路由也必须包装在 web 中间件组中,这也可能是问题所在。

将您的路由放在网络中间件中。或者在 App\http\kernel 中将所有路由从 web 复制到受保护的 $middleware 数组。

这真的很烦人,但在其他一切之后,这似乎是一个奇怪的错误,由一个 Homestead 框上的多个 Laravel 站点引起。我以不同方式设置了 session 密钥并清除了缓存,但它仍然无法正常工作。

销毁 homestead 盒子并重建它似乎解决了这个问题。感谢所有评论和寻找解决方案的尝试。