延迟laravel容器和认证扩展的详细解决方案加载

延迟laravel容器和认证扩展的详细解决方案加载
昨天,我写了根据手册教程认证扩展。根据包装独立原则,我不想写作者::延长()在start.php。毫无疑问,我选择在服务提供者寄存器()方法中注册扩展驱动程序,但是它违背了您的意愿…
发现问题
我写这个的时候,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){ });

}
由于认证是没有注册,我们手动调用它的登记方法登记。

以上是本文的全部内容,希望大家能喜欢。

tag:扩展认证解决方案加载延迟

相关内容