Laravel 5.2 - 会话不会在路由更改中持续存在

时间:2016-01-09 05:16:51

标签: php laravel laravel-5.2

我刚刚安装了Laravel 5.2。我进入我的项目几个小时,我注意到会话不会在路线上持续存在。在表单上使用验证服务时,我首先注意到了这一点。验证失败时$error变量为空。

我创建了两条简单的路线来重现这个问题。代码如下。 Foo路由会加载会话,但Bar路由不会。

  • Laravel.log是空的。
  • sudo chmod -R 777设置存储空间
  • 我尝试过数据库驱动程序和文件驱动程序。同样的结果。
  • 我已更新数据库以包含会话表更改(用户ID等)
  • php artisan cache:clear
  • php artisan config:clear
  • 使用文件驱动程序时,我看到会话文件存储在storage/framework/sessions
  • 我从5.2资料库中获取了app/Http/Kernel.php的新副本

routes.php文件

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


    Route::get('foo','AuthController@foo');
    Route::get('bar','AuthController@bar');


});

AuthController.php

namespace Zocial\Http\Controllers;

class AuthController extends Controller
{

 public function foo()
 {
  \Session::put('user','testing');

  //session( ['user' => 'testing'] ); not working either
  return \Session::get('user');
 }

 public function bar()
 {
  return "Session here: " . \Session::get('user');
 }

}

配置/ session.php文件

return [

    'driver' => env('SESSION_DRIVER', 'database'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => true,
    'files' => storage_path('framework/sessions'),
    'connection' => env('DB_CONNECTION','mysql'),
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => env('APP_DOMAIN', null),
    'secure' => false,

];

3 个答案:

答案 0 :(得分:0)

你能试试吗?

public function foo(Request $request)
{
    $value = $request->session()->put('key', 'value');

}

public function bar(Request $request)
{
    $value = $request->session()->get('key');
    return $value;
}

答案 1 :(得分:0)

如果您使用5.2中包含的默认身份验证,请尝试执行此操作:

php artisan make:auth

这将重新创建您的auth控制器以及laravel 5.2包含的标准auth附带的所有其他内容。

这是唯一帮助我的事情。 (我将会话设置为数据库后,它停止了工作......)

更新1

显然,当你在routes.php中定义了一个利用“web”中间件的路由时,它会将你从应用程序中注销并给你一个令牌不匹配。

像这样:(注意下面的代码不工作)

Route::auth();

Route::get('/home', 'HomeController@index');


Route::group(['middleware' => 'web'], function() {
    Route::get('/', function () {
        return view('welcome');
    });
});

访问您网站的根目录会将您注销,当您再次访问/ home时,您将被重定向到该登录名。如果您尝试再次登录,则会出现令牌不匹配的情况。

以下内容阻止了错误显示:

Route::auth();

Route::get('/home', 'HomeController@index');

Route::get('/', function () {
    return view('welcome');
});

要么我不理解新的中间件,要么它不起作用,因为我的“/”路由应该使用网络中间件还是我错了?

解决方案: 您需要从路由/路由组中删除Web中间件,因为从5.2开始自动添加Web中间件,这也是导致问题的原因。

答案 2 :(得分:0)

我注意到如果在config / session.php下将'secure'设置为true并且您没有通过HTTPS访问您的网站,则会话不会持续存在。我通过将'secure'设置为false来解决这个问题。