我将Laravel 5.1网站更新为Laravel 5.2.39。我和#34;批准的"有很多问题。升级过程(特别是中间件)所以我最终创建了一个新的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中将路由包装在Web中间件中是必要的 - 但是,我已经尝试了两种方式同样的错误。
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()
类时,我会转储会话令牌,它与表单令牌不同 - 这意味着它们永远不会匹配。不知道在这里会发生什么。
答案 0 :(得分:1)
这真的很烦人,但是在其他一切之后,这似乎是由一个Homestead盒子上的多个Laravel站点引起的奇怪错误。我以不同的方式设置了会话密钥,并清除了缓存,但它仍然无效。
摧毁宅基地并重建它似乎解决了这个问题。感谢所有评论和尝试寻找解决方案。
答案 1 :(得分:0)
只要您拥有Form:open
声明,就不再需要单独的 csrf_field 行。 Form::open
应该照顾它。
您使用的是laravel集体表格套餐吗?旧的照明包不再维护。
正如之前的用户所说,所有路由也必须包含在Web中间件组中,这也可能是问题所在。
答案 2 :(得分:0)
将您的路线放在网络中间件中。或者在App\http\kernel
中复制从web到受保护$middleware
数组的所有路由。