Получить каталог проекта по команде 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".

Другие вопросы по тегам