个性化阅读
专注于IT技术分析

如何在Symfony 4命令中从dotenv文件vars中检索值

本文概述

最近, 由于Windows中Xampp的PHP体系结构始终为32位的问题, 该脚本使用了2048MB以上的RAM, 因此无法在浏览器上运行。这迫使我下载64位版本的PHP, 并为要在浏览器上实现的逻辑创建一个Symfony命令。不幸的是, 脚本的一个非常重要的部分, 特别是一行, 使我发疯, 因为由于未知的原因, 该脚本始终是空的。

问题在于尝试使用PHP的getenv方法从我的.env文件中获取DATABASE_URL的值:

// in the first versions of Symfony 4 you could retrieve it
// with getenv
getenv("DATABASE_URL");

// In most recent versions of Symfony 4 and 5
// You may retrieve this value through the global $_ENV 
$_ENV("DATABASE_URL");

在控制器中, 它工作得很好, 它曾经返回一个字符串, 如:

DATABASE_URL=sqlite:///%kernel.project_dir%/var/data.db

但是, 在控制台命令中, 它始终为空。正如许多用户所报告的那样, 这似乎仅在Apache服务器中发生, 但是如果你要实施解决方案, 则应该与平台无关。我最终使用的解决方案只是将我需要的.env参数注入命令中, 或者创建一个允许我获取参数的服务, 然后将服务注入命令中。在本文中, 我将向你说明如何以两种方式进行:

A.注入单个参数

只要要将仅几个参数传递给命令, 就可以简单地注册数据库参数并在构造函数中获取它, 然后继续在services.yaml中注册该参数:

# config/services.yaml
services:
    App\Command\YourCommand:
        $databaseUrl: '%env(DATABASE_URL)%'

因此, 请在命令类的构造函数中检索变量, 例如:

<?php

// src/Command/YourCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class YourCommand extends Command
{
    // the name of the command (the part after "bin/console")
    protected static $defaultName = 'app:do-something';

    private $databaseUrl;

    protected function configure($databaseUrl)
    {
        $this->databaseUrl = $databaseUrl;
        // ...
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // The database URL is: sqlite:///%kernel.project_dir%/var/data.db
        $output->writeln("The database URL is: " . $this->databaseUrl);

        return 0;
    }
}

仅需几个参数就足够了。

B.创建一个服务以从services.yaml获取参数

如前所述, 从命令中的.env文件获取参数的唯一方法是将其注册到services.yaml文件中。但是, 如果你在yaml文件中注册了许多参数, 则可能不希望将类中的每个变量都注入并在构造函数中检索它们, 而只需在yaml文件中注册参数即可:

# config/services.yaml
parameters:
    app.parameter1: '%env(SOME_PARAMETER1)%'
    app.parameter2: '%env(SOME_PARAMETER2)%'
    app.parameter3: '%env(SOME_PARAMETER3)%'
    app.parameter4: '%env(SOME_PARAMETER4)%'
    app.parameter5: '%env(SOME_PARAMETER5)%'
    app.parameter6: '%env(SOME_PARAMETER6)%'
    app.parameter7: '%env(SOME_PARAMETER7)%'

然后创建一个服务, 使你可以检索yaml文件中的已定义参数。我们在本文中写了一篇有关如何创建此类服务的教程, 你可以在你的项目中实现它, 然后要求它并像这样获得它们:

<?php

// src/Command/YourCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

// Import helper
use App\Service\ContainerParametersHelper;

class YourCommand extends Command
{
    // the name of the command (the part after "bin/console")
    protected static $defaultName = 'app:do-something';

    private $pathHelpers;

    protected function configure(ContainerParametersHelper $pathHelpers)
    {
        $this->pathHelpers = $pathHelpers;
        // ...
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln("Parameter value: " . $this->pathHelpers->getParameter('app.parameter1'));
        $output->writeln("Parameter value: " . $this->pathHelpers->getParameter('app.parameter2'));
        $output->writeln("Parameter value: " . $this->pathHelpers->getParameter('app.parameter3'));
        $output->writeln("Parameter value: " . $this->pathHelpers->getParameter('app.parameter4'));
        $output->writeln("Parameter value: " . $this->pathHelpers->getParameter('app.parameter5'));
        $output->writeln("Parameter value: " . $this->pathHelpers->getParameter('app.parameter6'));
        $output->writeln("Parameter value: " . $this->pathHelpers->getParameter('app.parameter7'));

        return 0;
    }
}

就是这样!你只应根据要发送给命令的参数数量来决定实施哪种解决方案。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 4命令中从dotenv文件vars中检索值

评论 抢沙发

评论前必须登录!