• 一种laravel特有的serviceProvider的加载方式


    这里的laravel版本5.5。

    我是使用到dingo这个包的时候,觉得很奇怪,我们一般的包使用的时候都需要加载一个serviceProvider,提供服务,dingo/api这里也有ServiceProvider,但是安装的时候,并没有让我们修改config/app.php 增加写入这个serviceProvider,这个是怎么做到的呢?

    具体的追查过程就不说了

    主要看Application.php的registerConfiguredProviders方法,里面有一行:

    public function registerConfiguredProviders()
        {
            // 这里是读取配置文件中app.provider中的服务
            $providers = Collection::make($this->config['app.providers'])
                            ->partition(function ($provider) {
                                return Str::startsWith($provider, 'Illuminate\');
                            });
            // 这里是读取bootstrap/cache/packages.php里面的信息,如果没有这个文件,就去读取每个包的composer.json里面的extra.laravel里面的providers,保存进入cache/services。
            $providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);
    
            // 加载provider里面的各个Service
            (new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
                        ->load($providers->collapse()->toArray());
        }
    

    换句话说,如果你这个包是希望用户composer引入的时候就注册ServiceProvider(而不是需要用户手动增加),那么就可以在你自己这个包里面的composer.json增加类似的代码:

    "extra": {
            "laravel": {
                "providers": [
                    "Dingo\Api\Provider\LaravelServiceProvider"
                ],
                "aliases": {
                    "API": "Dingo\Api\Facade\API"
                }
            }
        },
    

    这样,你这个包的providers和alias就自动增加到项目里面去了。这个比以前每次安装还需要在安装文档里面让用户修改配置可好得多了。

    当然,这个是laravel特有的,如果你的包只是为laravel专门设计的,那么这个方式就完全可以用。

  • 相关阅读:
    mac下安装apache tomcat
    前端常用框架和js插件 UI组件等
    HBase二级索引的设计
    通过BulkLoad的方式快速导入海量数据
    Phoenix二级索引(Secondary Indexing)的使用
    java并发编程--Executor框架
    Spark常用函数讲解之Action操作
    Java并发编程--Volatile详解
    Spark常用函数讲解之键值RDD转换
    图解堆排序
  • 原文地址:https://www.cnblogs.com/yjf512/p/8243602.html
Copyright © 2020-2023  润新知