本文概述
- A.注入单个参数
- B.创建一个服务以从services.yaml获取参数
问题在于尝试使用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中检索值】编码愉快!
推荐阅读
- 如何建立IT网络审核清单
- 如何在Symfony 5中的命令内部渲染Twig视图
- MySQL 索引管理及执行计划
- InnoDB 表空间
- 浅入浅出 MySQL 索引
- ArcGIS10.7连接Windows下HGDB5.6.5
- 探究Presto SQL引擎-巧用Antlr
- sqlserver登录名及角色权限的那些事
- 简单了解 MySQL 中相关的锁