在命令 symfony 3.4 上获取项目目录
Posted
技术标签:
【中文标题】在命令 symfony 3.4 上获取项目目录【英文标题】:Get project directory on command symfony 3.4 【发布时间】:2019-06-09 09:43:48 【问题描述】:使用 symfony 3.4 在控制器中,我可以使用此方法获取项目目录:
$this->get('kernel')->getProjectDir()
我想在命令 symfony (3.4) 上获取项目目录,最好的做法是什么?
谢谢
【问题讨论】:
同样的方法,但最好将Kernel
直接注入你的Command
并从中调用getProjectDir()
加油@Flying,你比这更清楚。
【参考方案1】:
很确定这个问题已经被问过很多次了,但我懒得去搜索它。此外,Symfony 已经从从容器中提取参数/服务转向注入它们。所以我不确定以前的答案是否是最新的。
这很容易。
namespace AppBundle\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Command\Command;
class ProjectDirCommand extends Command
protected static $defaultName = 'app:project-dir';
private $projectDir;
public function __construct($projectDir)
$this->projectDir = $projectDir;
parent::__construct();
protected function execute(InputInterface $input, OutputInterface $output)
$output->writeln('Project Dir ' . $this->projectDir);
因为你的项目目录是一个字符串,autowire 不会知道要注入什么值。您可以将命令显式定义为服务并手动注入值,也可以使用绑定功能:
# services.yml or services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
bind:
$projectDir: '%kernel.project_dir%' # matches on constructor argument name
【讨论】:
【参考方案2】:您可以将KernelInterface
注入到命令中,只需将其添加到构造函数参数中,然后使用$kernel->getProjectDir()
获取项目目录:
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class FooCommand extends Command
protected $projectDir;
public function __construct(KernelInterface $kernel)
parent::__construct();
$this->projectDir = $kernel->getProjectDir();
protected function execute(InputInterface $input, OutputInterface $output): int
echo "This is the project directory: " . $this->projectDir;
//...
【讨论】:
【参考方案3】:好吧,我想说,直接在你的命令中注入 %kernel.project_dir% 或 %kernel.root_dir% 参数。无需使您的命令依赖于内核服务。
顺便说一句,您还可以让您的 Command 扩展 Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand 这是一个抽象类。因此,您只需调用 getContainer 方法即可在命令中访问容器。
但是,我实际上不会建议您这样做。最好利用autowiring 或以“yaml”方式配置您的服务。
【讨论】:
ContainerAwareCommand
自 Sf 4.2 起已弃用,因此不应再使用它
是否也适用于 3.4?因为他没有使用4.2
不是,但今天编写显然需要在升级 Symfony 时更改的代码是没有意义的。通过不在新代码中使用已弃用的功能,您以后的工作量会减少
嗯,是的,但是在这种情况下,当你说话时要更准确,因为有些人可以理解它在 3.4 中也已被弃用,实际上它不是
我写得很清楚,自 4.2 起已弃用它以上是关于在命令 symfony 3.4 上获取项目目录的主要内容,如果未能解决你的问题,请参考以下文章
在 symfony 3.4 上安装 FOSUserBundle 时出错