会话变量BaseController中的问题

时间:2017-02-08 08:32:57

标签: php laravel laravel-5.3 laravel-5.4

问题

Session::get无法在Base Controller

中使用

以下情况未显示正确的会话值

登录控制器

class LoginController extends \App\Http\Controllers\Web\BaseController
{
    public function Login() {
        return View("UserManagement.Auth.Login.login");
    }
}

基本控制器

class BaseController extends Controller
{
    public function __construct() {
        if(\Session::get("CurrentLanguage") != null) {
            dd('here');
            \App::setLocale(\Session::get("CurrentLanguage"));
        }
        else {
            dd('here1');
            \Session::put("CurrentLanguage", "en");
            \App::setLocale("en");
        }
    }
}

以下案例显示正确的会话值

基本控制器

class BaseController extends Controller
{

}

登录控制器

class LoginController extends \App\Http\Controllers\Web\BaseController
{
    public function Login() {
        if(\Session::get("CurrentLanguage") != null) {
            dd('here');
            \App::setLocale(\Session::get("CurrentLanguage"));
        }
        else {
            dd('here1');
            \Session::put("CurrentLanguage", "en");
            \App::setLocale("en");
        }
        return View("UserManagement.Auth.Login.login");
    }
}

问题在于,我必须在许多控制器中使用基本控制器。有没有办法让会话在Base Controller中工作?

1 个答案:

答案 0 :(得分:0)

根据以下网址,您无法再使用Laravel 5.3中控制器的构造函数中的会话。这是因为在构建控制器的时间点,处理会话的中间件尚未运行。显然,能够访问控制器中的会话绝不是预期的功能。由于此受影响的会话,您将无法访问控制器构造函数中的经过身份验证的用户。

然而,解决这个问题的方法是在构造函数中使用基于闭包的中间件。

class BaseController extends Controller
{
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            if(\Session::get("CurrentLanguage") != null) {
                dd('here');
                \App::setLocale(\Session::get("CurrentLanguage"));
            }
            else {
                dd('here1');
                \Session::put("CurrentLanguage", "en");
                \App::setLocale("en");
            }

            return $next($request);
        });
    }
}

这是有效的,因为您的控制器只是定义了一个中间件,以便稍后运行该会话。

它在第二个示例中起作用的原因是您正在使用控制器方法访问会话。在那个时间点会话可用,因为中间件将运行。