ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – 在运行时使用env()在Symfony 3.2中加载外部环境参数返回未解析的值

2019-05-27 18:15:44  阅读:216  来源: 互联网

标签:php dependency-injection configuration ioc-container symfony


我在使用symfony 3.2 console,config和YAML组件的应用程序中有一个参数文件,我尝试在Service Container参数中设置external Parameters from environment变量.

我创建容器构建器.

$container = new ContainerBuilder();

我使用文件定位器来定位资源:

$container = new ContainerBuilder();

加载器解析器加载资源

LoaderResolver();

并使用加载方法:

$this->load('parameters.yml');

parameters.yml文件:

parameters:
  database:
    driver: pdo_mysql
    host: 127.0.0.1
    dbname: dbname
    user: env(VAL1)
    password: env(VAL2)
  Local: us-en

编译容器后,尝试从参数包中检查获取值:

$container->getParameterBag()->all()

它返回我的价值如下:

env_VAL1_3ec776edc429c1734ed780a29a0af538,env_VAL2_3ec776edc429c1734ed780a29a0af538

我认为容器无法从环境中解析这些值.

注意:我使用以下方法设置环境变量:

$export VAL1='SOME TEXT'

任何人都知道为什么?

解决方法:

所以我花了一些时间研究这个’问题’,这就是我发现的……

获得env(VAL1)工作的唯一方法是使用PHPDumper生成容器到PHP文件,然后使用生成的容器.没有其他方法可以使它工作,因为它只解析该文件中的环境.

在正常的Symfony项目中,有一个生成的var / cache / dev / appDevDebugProjectContainer.php文件.方法getDynamicParameter看起来像这样

 private function getDynamicParameter($name)
    {
        switch ($name) {
            case 'kernel.root_dir': $value = ($this->targetDirs[3].'/app'); break;
            case 'kernel.logs_dir': $value = ($this->targetDirs[2].'/logs'); break;
            case 'user': $value = $this->getEnv('VAL1'); break;
            case 'session.save_path': $value = ($this->targetDirs[3].'/app/../var/sessions/dev'); break;
            case 'router.resource': $value = ($this->targetDirs[3].'/app/config/routing_dev.yml'); break;
            default: throw new InvalidArgumentException(sprintf('The dynamic parameter "%s" must be defined.', $name));
        }
        $this->loadedDynamicParameters[$name] = true;

        return $this->dynamicParameters[$name] = $value;
    }

它是唯一评估env(VAL1)的地方.

因此,对于您的情况,解决方案如下.

我使用简化的parameters.yml:

parameters:
    user: '%env(VAL1)%'

我做的出口:

export VAL1=abc

PHP代码:

$container = new ContainerBuilder();

$loader = new YamlFileLoader(
    $container,
    new FileLocator('.')
);

$loader->load('parameters.yml');

$container->compile();

$dumper = new PhpDumper($container);

$content = $dumper->dump(
    [
        'class' => 'DumpedContainer',
        'base_class' => 'Container',
        'file' => 'DumpedContainer.php',
        'debug' => true
    ]
);

// Use this code if you want to write file to the disk
$cache = new ConfigCache('DumpedContainer.php', true);
$cache->write($content, $container->getResources());
require_once $cache->getPath();

// ... otherwise use this code
//$content = str_replace('<?php', '', $content);
//eval($content);

$container = new DumpedContainer();

$user = $container->getParameter('user'); // $user = 'abc'

在生成的代码中,您将看到以下执行魔术的方法

private function getDynamicParameter($name)
{
    switch ($name) {
        case 'user': $value = $this->getEnv('VAL1'); break;
        default: throw new InvalidArgumentException(sprintf('The dynamic parameter "%s" must be defined.', $name));
    }
    $this->loadedDynamicParameters[$name] = true;

    return $this->dynamicParameters[$name] = $value;
}

这个解决方案工作正常,但看着它我想知道你的项目是否真的需要这个? getenv()有什么问题?

标签:php,dependency-injection,configuration,ioc-container,symfony
来源: https://codeday.me/bug/20190527/1165032.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有