问题
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中工作?
答案 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);
});
}
}
这是有效的,因为您的控制器只是定义了一个中间件,以便稍后运行该会话。
它在第二个示例中起作用的原因是您正在使用控制器方法访问会话。在那个时间点会话可用,因为中间件将运行。