无法访问 ServiceProvider 中的 config() |拉拉维尔

Posted

技术标签:

【中文标题】无法访问 ServiceProvider 中的 config() |拉拉维尔【英文标题】:Cannot access config() in ServiceProvider | Laravel 【发布时间】:2019-01-01 08:38:00 【问题描述】:

我为 paypal 创建了一个自定义服务提供商。 当我尝试从提供程序内部访问配置时,它返回 null。

下面是我写的代码。

public function register()

    $this->app->singleton(ApiContext::class, function($app)
        $paypalConf = $app['config']->get('paypal');
        $apiContext = new ApiContext(new OAuthTokenCredential(
            $paypalConf['client_id'],$paypalConf['client_secret']
        )); 
        $apiContext->setConfig($paypalConf['settings']);
        return $apiContext;
    );

但它会引发以下错误

if (empty($credObj)) 
        throw new PayPalInvalidCredentialException("Credential not found for " .  ($userId ? $userId : " default user") .
        ". Please make sure your configuration/APIContext has credential information");
    

“未找到默认用户的凭据。请确保您的配置/APIContext 具有凭据信息

这肯定是因为我的配置文件返回 null。

这是我的 paypal.php

return [
'client_id' => env('PAYPAL_CLIENT_ID', ''),
'client_secret' => env('PAYPAL_SECRET', ''),
'settings' => [
    'mode' => env('PAYPAL_MODE', ''),
    'http.ConnectionTimeOut' => 30,
    'log.LogEnabled' => true,
    'log.FileName' => storage_path().'/logs/paypal.log',
    'log.LogLevel' => 'ERROR'
]];

并且 PAYPAL 凭证存在于 .env 文件中。

我已经尝试清除配置并再次缓存它,但它没有工作。

更新

似乎 register 方法在服务提供商中不起作用。 但是我已经在 config/app.php 中注册了提供者

【问题讨论】:

你有没有试过dd($paypalConf, $app['config']->get('app.name')),在第一线之后的服务商?我闻到一种拼写错误。 @Kyslik dd 在那里不起作用。 您在config/app.php注册服务商了吗? @Kyslik 是的,提供者已在提供者数组中注册。 然后dd出闭包,需要知道register方法是否在执行。 【参考方案1】:

在配置文件夹paypal.php 不是paypal.config

<?php

    return [
        'client_id' => env('PAYPAL_CLIENT_ID', ''),
        'client_secret' => env('PAYPAL_SECRET', ''),
        'settings' => [
            'mode' => env('PAYPAL_MODE', ''),
            'http.ConnectionTimeOut' => 30,
            'log.LogEnabled' => true,
            'log.FileName' => storage_path().'/logs/paypal.log',
            'log.LogLevel' => 'ERROR'
    ]];

然后你可以得到值:

Config::get('paypal.client_id');
Config::get('paypal.settings.mode');

【讨论】:

抱歉打错了,是config/paypal.php 您是否在 config 文件夹中创建了该文件?并且您在服务提供者的顶部使用了use Illuminate\Support\Facades\Config; 吗? laravel 文件夹附带的配置文件夹 my paypal.php 位于该文件夹中。是的,我正在使用配置; 使用配置 试试辅助方法config('paypal.client_id'); 不,我先尝试了 helper,然后转移到 app['config'] 甚至 Facade。他们都没有工作。我真的在拉头发。【参考方案2】:

没有更多信息...

清除配置缓存:php artisan config:clear

如果您有一个缓存配置并且您将任何内容添加到配置文件或环境中,包括另一个服务提供商到 config/app.php,它不会被拾取,因为它使用您配置的缓存版本。

您只需进入tinker 并在更改任何配置文件或环境后请求这些配置值即可验证此类内容。

【讨论】:

我已经清除了缓存的配置。它仍然没有工作。我删除了服务提供者并进行了手动类实例化。感谢您的帮助。

以上是关于无法访问 ServiceProvider 中的 config() |拉拉维尔的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部应用访问另一个应用中的contentprovider

在serviceprovider中的Laravel包开发注册刀片部分

ServiceProvider.GetService<Type> 每次使用都会抛出异常

为啥.net网站访问出错 provider: TCP 提供程序, error: 0 -

在 ASP.NET 核心中访问 HttpClientFactory 定义中的外部参数/值

无法访问返回的结构中的指针值 [C]