服务提供者
- 创建\Foundation\RegisterProvidrs.php,写bootstrap方法,用于服务注册,bootstrap方法中调用app类的registerConfigProviders
- 然后在Kernel.php对RegisterProvider进行加载
- Kernel.php->registerProvider.php->bootstrap()->app->registerConfigProviders()->ProviderRegistory->load()
- 为什么不直接在App里直接调用ProviderRegister
- 门面,一些核心服务加载都是使用容器注册的,服务提供者是根据直接new的
- 服务启动,创建\Foundation\BootProvidrs.php
- Kerenl->BootProvidrs.php->bootstap()->app->boot()
源码见个人git https://github.com/mafa1993/slaravel
<?php
//用于服务加载
namespace Slaravel\Foundation;
class ProviderRegistory
{
protected $app;
public function __construct(Application $app)
{
$this->app = $app;
}
/**
* 服务提供者注册
* @param array $providers
*/
public function load($providers){
foreach ($providers as $provider){
$this->register($provider);
}
}
/**
* 根据不同类型进行分发 注册
* @param string $provider 需要注册的服务
*/
protected function register($provider){
if(is_scalar($provider)){
$provider = $this->resolveProvider($provider);
}
//利用resolve初始化以后,调用服务的register方法
$provider->register();
//服务提供者里可以定义bindings数组,进行一些类的绑定
//属性如果存在进行绑定
if(property_exists($provider,'bindings')){
foreach ($provider->bindings as $key=>$val){
$this->app->make($key,$val);
}
}
//todo 单利绑定 singletons
$this->app->markAsRegistered($provider);
}
/**
* 服务提供者注测,核心方法
*/
protected function resolveProvider($provider){
return new $provider($this->app);
}
}
//registerprovider
<?php
//中转类,ProviderRegistory是具体实现
//kernel中注册这个,这个调用app中的方法,app中在调用ProviderRegistory
namespace Slaravel\Foundation\Bootstrap;
use Slaravel\Foundation\Application;
class RegisterProviders
{
public function bootstrap(Application $app){
$app->registerConfigProviders();
}
}









网友评论