Уверен, этот вопрос задавался много раз, но мне лень его искать. Плюс 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