美文网首页
手写一个laravel(六)服务提供者

手写一个laravel(六)服务提供者

作者: mafa1993 | 来源:发表于2020-11-29 15:29 被阅读0次

服务提供者

  1. 创建\Foundation\RegisterProvidrs.php,写bootstrap方法,用于服务注册,bootstrap方法中调用app类的registerConfigProviders
  2. 然后在Kernel.php对RegisterProvider进行加载
    • Kernel.php->registerProvider.php->bootstrap()->app->registerConfigProviders()->ProviderRegistory->load()
    • 为什么不直接在App里直接调用ProviderRegister
  3. 门面,一些核心服务加载都是使用容器注册的,服务提供者是根据直接new的
  4. 服务启动,创建\Foundation\BootProvidrs.php
  5. 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();
    }
}

相关文章

网友评论

      本文标题:手写一个laravel(六)服务提供者

      本文链接:https://www.haomeiwen.com/subject/vhdkwktx.html