【发布时间】:2014-03-10 19:18:20
【问题描述】:
据我了解,Laravel 除了 app/app.php 中的 provider 列表之外,还生成了一个 service manifest,它是一种代理。它负责为给定请求仅加载必要的提供程序。 例如如果我们在请求中不使用查看服务提供者(即使它已注册),Laravel 也不会加载它。
我说的对吗?
【问题讨论】:
据我了解,Laravel 除了 app/app.php 中的 provider 列表之外,还生成了一个 service manifest,它是一种代理。它负责为给定请求仅加载必要的提供程序。 例如如果我们在请求中不使用查看服务提供者(即使它已注册),Laravel 也不会加载它。
我说的对吗?
【问题讨论】:
有点是也不是。据我所知,Laravel 所做的是检查 config/app.php 中的 providers 键的内容。对于其中的每一个,它都会实例化服务提供者类。然后检查deferred 属性是否设置为true。
如果不是,则以正常方式注册和启动该类。
如果 deferred 设置为 true,则该类会被搁置,直到需要它为止。检查provides 数组的内容以查看在此类中注册了哪些 IoC 密钥,然后一旦需要注册其中一个,就会像其他任何服务一样注册和启动服务提供者。
存储目录中的服务清单只是缓存此服务提供者检查的输出,因此它不必每次请求都执行此操作(即,它不必实例化和检查deferred 和provides -无论如何,非延迟类仍然必须被实例化、注册和引导)。
我不确定这个缓存在什么情况下“无效”。大概是当providers 配置键的实际内容发生变化时,但也许它也可以在不实例化它们的情况下检查 SP。
至于非延迟服务提供者 - 如果不使用给定的 IoC 服务,那么它永远不会被实例化是正确的。但据我所知,这与服务清单不同。
【讨论】: