Получить каталог проекта по команде symfony 3.4
Используя symfony 3.4 В контроллере я могу получить каталог проекта, используя этот метод:
$this->get('kernel')->getProjectDir()
Я хотел бы получить каталог проекта по команде symfony (3.4), что является лучшим способом сделать это?
Спасибо
2 ответа
Я уверен, что этот вопрос задавался много раз, но мне лень его искать. Плюс 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
Вы можете ввести 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;
//...
}
}
Ну, я бы сказал, вставьте параметры %kernel.project_dir% или %kernel.root_dir% непосредственно в вашу команду. Нет необходимости делать вашу команду зависимой от службы ядра.
И, кстати, вы также можете сделать так, чтобы ваша Command расширяла Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand, который является абстрактным классом. Таким образом, вы можете получить доступ к контейнеру в вашей команде, просто вызвав метод getContainer.
Но я бы не советовал вам этого на самом деле. Лучше воспользоваться преимуществами автоматической разводки или настроить свой сервис "yaml".