laravel5.*에서는 세션 시작이
과 같은 웹 미들웨어에 배치됩니다.<code> /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, //<--------- \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', 'bindings', ], ];</code>
그리고 Route loading 미들웨어의 코드에 따르면 컨트롤러는 미들웨어가 만들어진 후에만 호출한다는 것을 알 수 있습니다
<code> /** * Get the middleware for the route's controller. * * @return array */ public function controllerMiddleware() { if (! $this->isControllerAction()) { return []; } return ControllerDispatcher::getMiddleware( $this->getController(), $this->getControllerMethod() ); }</code>
이때 문제가 발생합니다. 생성자에 사용자 로그인 상태가 결정됩니다. 사용자가 이미 로그인되어 있으면 로그인된 사용자 정보가 $this->에 저장됩니다. ;login_user_info 첫 번째 컨트롤러를 만들면 세션이 아직 시작되지 않았으므로 생성자에서 로그인한 사용자의 session_id를 얻을 수 없습니다.
<code>/** * 控制层公有方法集合 * Class BaseController */ abstract class BaseController extends Controller { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public $login_user_info; public $login_subuser_info; public function __construct() { $this->userModel = app(UserModel::class); if (session()->get('user_id')) { $this->login_user_info = $this->userModel->getLoginUser(); //设置模板全局变量 view()->share(['login_user_info' => $this->login_user_info]); } }</code>
이때 StartSession 미들웨어 코드가 실행되었기 때문에 미들웨어에서 세션을 얻을 수 있는지 테스트해봤습니다. 프레임워크를 laravel로 전환하므로 원래 논리를 최대한 유지하기 위해 이상한 작성 방법이 있으므로 현재로서는 Auth를 사용하지 않습니다. 생성자에서 세션을 가져올 수 있는 방법이 있습니까? 도와주세요, 감사합니다