2
votes

Récupérer le répertoire du projet sur la commande symfony 3.4

Utilisation de symfony 3.4 Dans le contrôleur, je peux obtenir le répertoire du projet en utilisant cette méthode:

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

Je voudrais obtenir le répertoire du projet sur la commande symfony (3.4), quelle est la meilleure pratique pour le faire?

Merci


2 commentaires

Même approche, mais il vaut mieux injecter directement Kernel dans votre Command et appeler getProjectDir () depuis celle-ci


Allez @Flying, tu sais mieux que ça.


3 Réponses :


1
votes

Eh bien, je dirais, injectez les paramètres % kernel.project_dir% ou % kernel.root_dir% directement dans votre commande. Inutile de rendre votre commande dépendante du service Kernel.

Et en passant, vous pouvez également faire en sorte que votre commande étende Symfony \ Bundle \ FrameworkBundle \ Command \ ContainerAwareCommand qui est une classe abstraite. Vous pouvez donc accéder au conteneur dans votre commande en appelant simplement la méthode getContainer .

En fait, je ne vous conseillerais pas de le faire. Mieux vaut profiter de autowiring ou configurer votre service de manière "yaml".


6 commentaires

Comme ContainerAwareCommand est obsolète depuis Sf 4.2, il ne faut plus l'utiliser


Est-ce aussi pour 3.4? Parce qu'il n'utilise pas 4.2


Ce n'est pas, mais cela n'a pas de sens d'écrire du code aujourd'hui qui doit évidemment être changé lors de la mise à niveau de Symfony. En n'utilisant pas de fonctionnalités obsolètes dans le nouveau code, vous aurez moins de travail plus tard


Eh bien, oui mais dans ce cas, soyez plus précis lorsque vous parlez car certaines personnes peuvent comprendre que c'est obsolète aussi pour 3.4 et en fait ce n'est pas


J'ai écrit très clairement qu'il est obsolète depuis la version 4.2


Je voulais dire, quand vous avez dit que cela n'a pas de sens d'écrire du code aujourd'hui qui doit évidemment être changé lors de la mise à niveau de Symfony. En n'utilisant pas de fonctionnalités obsolètes dans le nouveau code, vous avez moins de travail plus tard ". Vous ne m'avez pas expliqué comme ça la première fois donc j'éviterais de vous répondre. Parce que c'est ce que vous pensez et peut-être que le type qui a créé la question ne pense pas que même.



8
votes

Je suis sûr que cette question a été posée plusieurs fois, mais je suis trop paresseux pour la rechercher. De plus, Symfony s'est éloigné de l'extraction des paramètres / services du conteneur pour les injecter. Je ne suis donc pas sûr que les réponses précédentes soient à jour.

C'est assez simple.

# services.yml or services.yaml
services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
            $projectDir: '%kernel.project_dir%' # matches on constructor argument name

Comme le répertoire de votre projet est une chaîne, autowire ne saura pas quelle valeur injecter. Vous pouvez soit définir explicitement votre commande en tant que service et injecter manuellement la valeur, soit utiliser la fonction de liaison:

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);
    }
}


0 commentaires

4
votes

Vous pouvez injecter KernelInterface à la commande en l'ajoutant simplement aux paramètres du constructeur, puis obtenir le répertoire du projet avec $ 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;
        //...
    }
}


0 commentaires