我似乎有一个循环依赖,我们有一个服务提供者,用服务容器注册一个对象,并引导一个配置文件和一些中间件,但现在中间件需要传递一个从请求JWT令牌解析的param实例化之前的服务容器,以及用户的保护,因为服务提供商需要能够获得经过身份验证的用户,并且有5种不同类型(申请人,经理,管理员等),因此需要保护到构造函数中的Auth :: guard($ guard) - > getUser(),因为它默认为申请人,如果为null,如Auth :: guard() - > getUser()。
你如何解决这样的问题?如果它有助于我使用tymons / JWTAuth(develop)分支来使用Laravel的后卫API。
我应该重构并直接绑定到中间件中的服务容器而根本不使用服务提供者,这样我就可以使用该参数来实例化服务容器对象和防护。似乎是唯一可行的解决方案,但在我重构所有这些之前,我想问一下是否有更好的方法。
我可以使用两个服务提供商吗?一个添加中间件,一个延迟的,将以某种方式最终注册服务容器的对象???如果是这样,你如何在配置中传递参数?根据我的了解,认为这是不可能的。
向对象添加setter并不是防止任何人在其他地方意外调用它的选项。
答案 0 :(得分:0)
您使用的是tymon/jwt-auth
吗?如果是这样,您的服务提供商可以设置一个事件监听器,在解码令牌时触发该事件监听器。类似的东西:
event()->listen('tymon.jwt.valid', function($user){
app()->singleton(YourInterface::class, function() use ($user){
//this will only register once your token is decoded
}
});
如果你没有使用这个软件包,你仍然可以监听一个事件,然后在激活后绑定。这与您的选项1基本相同,但至少它可以将代码组织在您想要的位置。