在命令symfony 3.4上获取项目目录

时间:2019-01-15 11:21:18

标签: symfony symfony-3.4

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

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

我想在symfony命令(3.4)上获取项目目录,什么是最佳实践?

谢谢

3 个答案:

答案 0 :(得分:6)

可以肯定,这个问题已经问了很多次了,但是我懒得去寻找它。另外,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);
    }
}

因为您的项目目录是一个字符串,所以自动装配将不知道要注入什么值。您可以将命令明确定义为服务并手动注入值,也可以使用绑定功能:

# services.yml or services.yaml
services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
            $projectDir: '%kernel.project_dir%' # matches on constructor argument name

答案 1 :(得分:4)

您可以将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;
        //...
    }
}

答案 2 :(得分:1)

好吧,我想直接在命令中插入%kernel.project_dir%%kernel.root_dir%参数。无需使您的命令依赖于内核服务。

顺便说一句,您还可以使Command扩展 Symfony \ Bundle \ FrameworkBundle \ Command \ ContainerAwareCommand ,这是一个抽象类。因此,您只需调用 getContainer 方法即可在命令中访问容器。

但是,我实际上不建议您这样做。更好地利用autowiring或以“ yaml”方式配置服务。