长标题。我有一个可以在任意点初始化的单例。可能会在控制器的构造函数期间调用它,这使其无法使用auth中间件,因为它可能无法构建。
我需要从某个地方吸引用户,但我找不到解决方法。会话,请求或中间件不保证存在或被初始化。我检查了外墙,什么也没有。
我敢肯定有一种方法可以解决这个问题。也许别人比我更机智。
答案 0 :(得分:0)
在遍历代码之后,这里是问题所在:
控制器通过路由器进行流水线传输,其顺序如下:
->运行控制器__construct()
->然后将其放入管道并按重要性顺序运行中间件
->然后执行其他操作(即调用index()或路由所需的任何入口点)
中间件是处理会话,请求和身份验证等的内容... 所有中间件都在控制器__construct和入口点之间运行。
因此,在控制器中,如果要执行以下操作:
__construct() {
$this->middleware(function(Request $request, $next) {
echo 'step 1';
});
echo 'step 2';
}
public function index() { echo 'step 3'; }
您会得到:
第2步<---在__construct范围内(中间件回调内部定义的任何内容在此处均不可用)。
步骤1 <-在__construct范围之外(但在index()范围之前)
第3步<-内部索引,第1步中定义的任何内容都可以在此处使用。
因此,在入口点函数中,任何需要满足这些条件的对象都可以保证存在,但除非存在于中间件回调中,否则不需要在构造函数内部。因此,您所能做的最好就是在“之间”运行代码。最后,在需要时使其可用。这里有一个限制,您可以解决它,但这很烦人。
在此之前,我无法找到一种获取用户会话的方法,我认为您必须从redis中读取它并以某种方式自己解决它,因为laravel对象还没有被填充,因为它在管道中还为时过早。 / p>