延迟laravel容器和认证扩展的详细解决方案加载
发现问题
我写这个的时候,LoauthServiceProvider:
复制代码代码如下所示:
公共函数寄存器()
{
◎认证::延长('loauth功能($ APP){ });
}
报告错误
复制代码代码如下所示:
调用未定义的方法说明支持外墙认证::延长()
找到原因
那时候,我很无聊,找到了原因。这是怀疑奥特是不是注册。检查中发现的登记,因为它可以用于路由;PHP工匠清楚编译是无用的;这是困惑,甚至怀疑我意外修改的核心课,下载laravel,再包,问题依旧。
到了晚上,我把眼睛上的延迟属性authserviceprovider美元。
根据手册和注释,我们知道美元的延迟属性用于延迟加载的服务提供商,并直点延迟执行登记()方法,它只需要配合提供()的方法。例如 uff1a
复制代码代码如下所示:
公共职能提供()
{
返回的数组('auth);
}
这是authserviceprovider方法,当框架初始化,依次加载服务提供者,如果发现服务提供者保护延迟=真美元会调用它提供()方法返回的数组包含延迟加载的服务名称,所以当我们在控制器或其他本地路由,呼叫作者:(法):当调用登记()设置方法。
确定问题的症结
所以问题是,既然是被动的延迟加载,也就是说,当我叫auth类的方法,它会自动实例化对象类。为什么我建议的方法不存在时,我叫LoauthServiceProvider,但它可以在路由。
我想这是因为优先级的问题,可能在loauthserviceprovider框架注册(登记):当奥特没有标记为延迟加载,这就造成了一个顺序问题,任何服务提供商不能立即加载在登记方法调用延迟加载服务。
经过研究,发现在核心代码说明 providerrepository基础
复制代码代码如下所示:
公共功能负载(应用程序应用程序,数组提供程序)
{
省略…
我们将在前面注册并将所有受欢迎的提供者注册为
应用程序,因此它们的服务可以在应用程序中注册为
提供的服务。然后,我们将在它上设置延迟服务列表。
foreach($体现'eager'} { $提供商)
{
为应用程序->登记(美元-> createprovider($ APP,提供美元));
}
在延迟加载/立即加载后标记服务
应用程序-> setdeferredservices美元(美元表现'deferred{ });
}
解决方案
虽然发现了问题,但并不意味着问题得到了解决。修改核心代码不是明智的选择,因此我们只能在自己的包中考虑它。
复制代码代码如下所示:
公共函数寄存器()
{
authprovider美元=新 authserviceprovider照亮auth(美元->应用程序);
authprovider美元->登记();
◎认证::延长('loauth功能($ APP){ });
}
由于认证是没有注册,我们手动调用它的登记方法登记。
以上是本文的全部内容,希望大家能喜欢。