【问题标题】:Get project directory on command symfony 3.4在命令 symfony 3.4 上获取项目目录
【发布时间】:2019-06-09 09:43:48
【问题描述】:

使用 symfony 3.4 在控制器中,我可以使用此方法获取项目目录:

$this->get('kernel')->getProjectDir()

我想在命令 symfony (3.4) 上获取项目目录,最好的做法是什么?

谢谢

【问题讨论】:

  • 同样的方法,但最好将Kernel直接注入你的Command并从中调用getProjectDir()
  • 加油@Flying,你比这更清楚。

标签: symfony symfony-3.4


【解决方案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 起已弃用它
      猜你喜欢
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多