我需要深刻理解laravel.因为我们开始使用laravel,所以我必须向开发团队解释一切.
如果错误,请更正此问题:当laravel启动时,由于性能提升,它将服务提供商拆分为'eager'和'deferred',然后它注册所有'eager'提供商,但不是'deferred'.
我的问题:每次我们使用延期服务,例如:
$validator = Validator::make(
//..
);
Run Code Online (Sandbox Code Playgroud)
laravel如何加载并注册该类/服务?我发现这可能与Illuminate\Foundation\ProviderRepositoryClass 70相关
$app->setDeferredServices($manifest['deferred']);
Run Code Online (Sandbox Code Playgroud)
但后来我卡住了.抱歉英语不好,希望大家都明白.谢谢.
Sam*_*amV 14
我也想知道答案,但我决定寻找自己.
如果你去app/storage/meta那里有一个services.json列出eager和deferred类.这样我们就不会为每个请求加载所有类,因为Form如果我们正在构建API ,我们可能永远不需要该类.
该ProviderRepository级扫描中列出的所有供应商app/config/app.php和实例为他们每个人的供应商(这些都不是实际库).
这些例如提供商CacheServiceProvider在Illuminate/Cache具有可变称为defer确定是否该库将被即时加载的推迟,直到需要.
这是引用 ProviderRepository
重新编译服务清单时,我们将遍历每个提供程序并检查它是否是延迟提供程序.如果是这样,我们将把它提供的服务添加到清单并记下提供者.
因为CacheServiceProvider这是设置为true.
所以说Validator::make()这里叫我收集的内容; 每个Facade例如Validator外观都扩展了基Facade类Illuminate\Support\Facades\Facade.
这有一个__callStatic($method, $args)非常自我解释的魔术方法,这个方法的要点是
$instance = static::resolveFacadeInstance(static::getFacadeAccessor());
Run Code Online (Sandbox Code Playgroud)
在这种情况下,facade门户访问器返回执行validation(Illuminate\Validation\Validator)的实际类的字符串:
protected static function getFacadeAccessor() { return 'validator'; }
Run Code Online (Sandbox Code Playgroud)
main方法resolveFacadeInstance检查返回的访问者是否是对象.如果它只是返回它,因为它可能是一个自定义Laravel包.
此方法的第二部分检查它是否已经解析,如果它已经返回.最后一部分:
return static::$resolvedInstance[$name] = static::$app[$name];
Run Code Online (Sandbox Code Playgroud)
通过位于前面提到的父类中的数组访问接口调用Illuminate\Foundation\Application(扩展Illuminate\Container\Container类).
所以static::$app[$name]电话:
public function offsetGet($key)
{
return $this->make($key);
}
Run Code Online (Sandbox Code Playgroud)
这位于Container班上
这导致我们make()在Application课堂上的方法:
public function make($abstract, $parameters = array())
{
if (isset($this->deferredServices[$abstract]))
{
$this->loadDeferredProvider($abstract);
}
return parent::make($abstract, $parameters);
}
Run Code Online (Sandbox Code Playgroud)
我会让你深入研究这个parent::make()方法,因为这将开始变得非常冗长,但是现在它是加载延迟提供者并通过它实例化它的地方.loadDeferredProvider()
public function loadDeferredProviders()
{
// We will simply spin through each of the deferred providers and register each
// one and boot them if the application has booted. This should make each of
// the remaining services available to this application for immediate use.
foreach (array_unique($this->deferredServices) as $provider)
{
$this->register($instance = new $provider($this));
if ($this->booted) $instance->boot();
}
$this->deferredServices = array();
}
Run Code Online (Sandbox Code Playgroud)
代码块中的注释应该解释剩下的正在发生的事情.
从这里开始,最后一部分__callStatic($method, $args)触发了实际的方法Validator::make().
public static function __callStatic($method, $args)
{
$instance = static::resolveFacadeInstance(static::getFacadeAccessor());
switch (count($args))
{
case 0:
return $instance->$method();
case 1:
return $instance->$method($args[0]);
case 2:
return $instance->$method($args[0], $args[1]);
case 3:
return $instance->$method($args[0], $args[1], $args[2]);
case 4:
return $instance->$method($args[0], $args[1], $args[2], $args[3]);
default:
return call_user_func_array(array($instance, $method), $args);
}
}
Run Code Online (Sandbox Code Playgroud)
所以外观调用Illuminate\Validation\Validator的是非静态方法validate().
我很确定这对于4.0是准确的但如果有任何错误请纠正我.
| 归档时间: |
|
| 查看次数: |
3469 次 |
| 最近记录: |