【问题标题】:How to process %kernel.project_dir% from a .env variable?如何处理 .env 变量中的 %kernel.project_dir%?
【发布时间】:2020-10-29 07:14:54
【问题描述】:

我将此添加到我的.env

PHOTOS_DIR=%kernel.project_dir%/var/photos

当然,当我尝试检索 $_ENV['PHOTOS_DIR'] 的值时,我得到了原始字符串 %kernel.project_dir%/var/photos

但是我怎样才能得到 Symfony 配置处理器处理的值,例如/my/project/var/photos?

编辑: 我知道可以在services.yaml 中添加它:

parameters:
    photos_dir: '%kernel.project_dir%/var/photos'

但我想将重要的配置数据保留在 .env 文件中。

【问题讨论】:

    标签: php symfony environment-variables


    【解决方案1】:

    为了扩展%kernel.project_dir%,在参数中使用%env(resolve:...),例如:

    parameters:
        photos_dir: '%env(resolve:PHOTOS_DIR)%'
    

    【讨论】:

    • 这是一个有趣的发现,你得到了我的支持 :)
    【解决方案2】:

    在 .env 文件中使用 symfony 参数是正确的。 Symfony 会自动解决它们。

    container编译完成后,绑定参数即可获取真实值。 .env

    PHOTOS_DIR=%kernel.project_dir%/var/photos
    

    services.yaml:

    parameters:
        photos_dir: '%env(PHOTOS_DIR)%'
    

    在您的应用程序中的某处:

    $container->getParameter('photos_dir');
    

    【讨论】:

    • 不,它不起作用:%kernel.project_dir% 未展开。
    【解决方案3】:

    您的 dotenv 不处理 symfony yaml 处理器参数。
    从 .env 文件中删除 %kernel.project_dir% ,并在 .yaml 中绑定如下参数:

    photos_absolute_path: '%kernel.project_dir%%env(PHOTOS_DIR)%'
    

    之后,您可以通过 photos_absolute_path 的名称从容器中获取参数,它将指向正确的位置

    【讨论】:

    • .env 文件用于相当简单的值配置,您可以在其中保留相对路径(例如 /var/photos)。如果您不想使用 symfony yaml 处理器(我不确定您为什么不这样做)。您可以创建自己的 .env 处理器并在您的 public/web 目录中的 app/index.php 中调用它,这会将您自己的令牌替换为某个值。 @yolenoyer
    • 起初,在发布我的 Q 之前,我想知道 DATABASE_URL=sqlite:///%kernel.project_dir%/var/data.db 是如何处理的,在 .env 中。你的解决方案没问题,但我仍然想知道。
    • 我相信可能发生了一些背景魔法,DATABASE_URL 与学说/orm、symfony/orm-pack 相关 我不熟悉源代码,但我相信数据库 url 解析器可能有一些东西为此,我刚刚在 Symfony 5.1 中对此进行了测试,但它没有解析参数。所以我敢打赌它与数据库 URL 解析器有关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多