Использование symfony 3.4 В контроллере я могу получить каталог проекта, используя этот метод:
$this->get('kernel')->getProjectDir()
Я хотел бы получить каталог проекта с помощью команды symfony (3.4), как лучше всего это сделать?
Спасибо
Давай @Flying, ты знаешь, что лучше.




Ну, я бы сказал, вставьте параметры % kernel.project_dir% или % kernel.root_dir% прямо в вашу команду. Нет необходимости делать вашу команду зависимой от службы ядра.
И, кстати, вы также можете сделать так, чтобы ваша команда расширяла Symfony \ Bundle \ FrameworkBundle \ Command \ ContainerAwareCommand, который является абстрактным классом. Таким образом, вы можете получить доступ к контейнеру в своей команде, просто вызвав метод getContainer.
Но на самом деле я бы вам не советовал. Лучше воспользуйтесь автомонтаж или сконфигурируйте свою службу "yaml" способом.
Поскольку ContainerAwareCommand устарел, начиная с версии Sf 4.2, его больше не следует использовать.
Это тоже для 3.4? Потому что он не использует 4.2
Это не так, но сегодня нет смысла писать код, который, очевидно, нужно изменить при обновлении Symfony. Если вы не используете устаревшие функции в новом коде, у вас будет меньше работы позже
Что ж, да, но в этом случае будьте более точными, когда говорите, потому что некоторые люди могут понять, что он устарел и для 3.4, а на самом деле это не так.
Я очень четко написал, что он устарел с версии 4.2.
Я имел в виду, когда вы сказали, что сегодня нет смысла писать код, который, очевидно, нужно изменить при обновлении Symfony. Если вы не используете устаревшие функции в новом коде, у вас будет меньше работы позже ». такой же.
Я уверен, что этот вопрос задавали много раз, но мне лень его искать. Кроме того, 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в вашCommandнапрямую и вызватьgetProjectDir()из него.