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

本文概述

  • A.注入单个参数
  • B.创建一个服务以从services.yaml获取参数
最近, 由于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 getenvgetenv("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.yamlservices:App\Command\YourCommand:$databaseUrl: '%env(DATABASE_URL)%'

因此, 请在命令类的构造函数中检索变量, 例如:
< ?php// src/Command/YourCommand.phpnamespace 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.yamlparameters: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.phpnamespace App\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; // Import helperuse 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; }}

就是这样!你只应根据要发送给命令的参数数量来决定实施哪种解决方案。
【如何在Symfony 4命令中从dotenv文件vars中检索值】编码愉快!

    推荐阅读