Получить каталог проекта командой symfony 3.4

Использование symfony 3.4 В контроллере я могу получить каталог проекта, используя этот метод:

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

Я хотел бы получить каталог проекта с помощью команды symfony (3.4), как лучше всего это сделать?

Спасибо

Тот же подход, но лучше ввести Kernel в ваш Command напрямую и вызвать getProjectDir() из него.

Flying 15.01.2019 12:23

Давай @Flying, ты знаешь, что лучше.

Cerad 15.01.2019 15:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
4
2
4 461
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ну, я бы сказал, вставьте параметры % kernel.project_dir% или % kernel.root_dir% прямо в вашу команду. Нет необходимости делать вашу команду зависимой от службы ядра.

И, кстати, вы также можете сделать так, чтобы ваша команда расширяла Symfony \ Bundle \ FrameworkBundle \ Command \ ContainerAwareCommand, который является абстрактным классом. Таким образом, вы можете получить доступ к контейнеру в своей команде, просто вызвав метод getContainer.

Но на самом деле я бы вам не советовал. Лучше воспользуйтесь автомонтаж или сконфигурируйте свою службу "yaml" способом.

Поскольку ContainerAwareCommand устарел, начиная с версии Sf 4.2, его больше не следует использовать.

Nico Haase 15.01.2019 15:22

Это тоже для 3.4? Потому что он не использует 4.2

fgamess 15.01.2019 15:25

Это не так, но сегодня нет смысла писать код, который, очевидно, нужно изменить при обновлении Symfony. Если вы не используете устаревшие функции в новом коде, у вас будет меньше работы позже

Nico Haase 15.01.2019 15:28

Что ж, да, но в этом случае будьте более точными, когда говорите, потому что некоторые люди могут понять, что он устарел и для 3.4, а на самом деле это не так.

fgamess 15.01.2019 15:30

Я очень четко написал, что он устарел с версии 4.2.

Nico Haase 15.01.2019 15:31

Я имел в виду, когда вы сказали, что сегодня нет смысла писать код, который, очевидно, нужно изменить при обновлении Symfony. Если вы не используете устаревшие функции в новом коде, у вас будет меньше работы позже ». такой же.

fgamess 15.01.2019 15:39
Ответ принят как подходящий

Я уверен, что этот вопрос задавали много раз, но мне лень его искать. Кроме того, 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;
        //...
    }
}

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