【问题标题】:session shows empty in other controller laravel 4会话在其他控制器 laravel 4 中显示为空
【发布时间】:2016-06-25 06:11:09
【问题描述】:

我有 2 个控制器 userControllerajaxController

我在userController 有 2 个这样的会话,

public function getCheckout()
{
    Session::put('vouchers', array());
    Session::put('finalcart', array());
}

我正在使用ajax 像这样在vouchers session 中添加更多值,然后使用ajax 调用calculateprice 方法。

public function checkvoucher()
{
    Session::put('vouchers',$vouchers);
}

现在,当我尝试像这样在ajaxController 中检索会话时

public static function calculateprice()
{
    $finalcart=Session::get('finalcart'); // returns with values that i pushed in another controller.

    $finalcart=Session::get('vouchers'); // returns empty.
}

首先我调用getCheckout 方法,然后调用checkvoucher,当我在checkvoucher 中打印该会话时,我得到了正确的结果。然后我打电话给calculateprice,它返回空会话。即使在将新值放入会话之后,它也只是采用旧的会话值。我不知道我在哪里做错了。

【问题讨论】:

  • 你能否在函数 checkvoucher() 中的 Session::put('vouchers',$vouchers) 行之后获取名称为 'vouchers' 的会话的值并共享输出?

标签: php laravel session laravel-4


【解决方案1】:

我认为 L5.2 实际上存在问题,因为如果您尝试访问基于会话的值(例如登录表单等),任何自定义错误页面都会显示此错误。

我假设这是因为异常没有通过 web 中间件组?

为了解决和防止“未按请求设置会话存储”出现在我移动的自定义 http 错误页面上:

\Illuminate\Session\Middleware\StartSession::class,

从 web 组到 kernel.php 文件中解决问题的全局中间件组。

所以我的 kernel.php 文件现在看起来像这样:

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
   /**
    * The application's global HTTP middleware stack.
    *
    * These middleware are run during every request to your application.
    *
    * @var array
    */
   protected $middleware = [
       \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
       \Illuminate\Session\Middleware\StartSession::class,
   ];

   /**
    * The application's route middleware groups.
    *
    * @var array
    */
   protected $middlewareGroups = [

       'web' => [
           \App\Http\Middleware\EncryptCookies::class,
           \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
           \Illuminate\View\Middleware\ShareErrorsFromSession::class,
           \App\Http\Middleware\VerifyCsrfToken::class,
       ],

       'api' => [
           'throttle:60,1',
       ],
   ];

   /**
    * The application's route middleware.
    *
    * These middleware may be assigned to groups or used individually.
    *
    * @var array
    */
   protected $routeMiddleware = [
       'auth' => \App\Http\Middleware\Authenticate::class,
       'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
       'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
       'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
   ];
}

如果有任何更好的解决方案,我会很高兴听到它们,因为我对如何实现中间件的把握有点薄弱!

【讨论】:

  • 您不应该将会话中间件添加到全局堆栈中,因为它也会为 API 启用会话。您的 API 路由中不需要会话。将中间件添加到web 堆栈会更好。
  • 可能是因为您没有将web 添加到您的路由组。
  • code Route::group(['middleware' => ['web'], 'prefix' => 'admin'], function () { \\all route define here }) ; code
猜你喜欢
  • 2013-10-29
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多