swoft-cloud / swoft

🚀 PHP Microservice Full Coroutine Framework
https://swoft.org
Apache License 2.0
5.59k stars 786 forks source link

在bean.php中使用config函数时候.此函数的第二个参数默认值没有生效 #1166

Open dongqibin opened 4 years ago

dongqibin commented 4 years ago
Q A
Bug report? yes
Feature request? no
Swoft version v2.0.7
Swoole version 4.4.4
PHP version 7.3.0
Runtime environment Alpine

Describe the bug bean.php 中使用config('jaeger.open', 1) 时候,默认值1没有生效

Expected behavior 希望默认值能够生效

Details

bean.php中使用config()函数,默认值无法生效

//app/bean.php
'testLogic' => [
    'class' => \App\Model\Logic\TestLogic::class,
    'open'  => config('jaeger.open', 1),
],

发现config()函数内部实现在没有Config这个bean的时候.返回了一个字符串.但是该字符串中没有体现默认值.

// vendor/swoft/framework/src/Helper/Functions.php
function config(string $key = null, $default = null)
{
    if (!BeanFactory::hasBean('config')) {
        //此字符串中没有体现默认值
        return sprintf('${.config.%s}', $key);
    }

    /* @var Config $config */
    $config = BeanFactory::getBean('config');

    return $config->get($key, $default);
}

后面根据字符串获取配置时候.默认值彻底丢了...

// vendor/swoft/framework/src/BeanHandler.php
public function getReferenceValue($value)
{
    $values = explode('.', $value);

    // Remove `config.` prefix, if exists.
    if (isset($values[0]) && $values[0] === 'config') {
        array_shift($values);
        $value = implode('.', $values);
    }

    /** @see \Swoft\Config\Config::get() */
    return Swoft::getBean('config')->get($value);
}
stelin commented 4 years ago

感谢反馈,我们修复下