Récupérer le répertoire racine d'un projet Symfony

Publié le 28/10/2018 • Actualisé le 08/12/2019


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

On appprend tous les jours ! Tellement vrai, en fait j'ai créé ce snippet car je ne connaissais pas la nouvelle fonction Kernel::getProjectDir() qui a été introduite dans Symfony 3.3. Avant, avec Symfony 3.2, on devait utiliser le répertoire parent du résultat de la fonction getRootDir(). C'est donc plus simple désormais. Je pense que je m'en souviendrai. 😉
[08/12/2018] Ajouté une alternative utilisant le paramètre kernel.project_dir du conteneur.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use Symfony\Component\HttpKernel\KernelInterface;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 *
 * @property KernelInterface $kernel
 */
trait Snippet6Trait
{
    public function snippet6(): void
    {
        // 1. Using the Kernel (typehint with "KernelInterface")
        // $projectDir = \dirname($kernel->getRootDir()); // <= Symfony 3.2
        $projectDir = $this->kernel->getProjectDir();    // >= Symfony 3.3
        echo 'With the kernel:'.$projectDir.PHP_EOL;

        // 2. Using the "kernel.project_dir" parameter
        $projectDirAlt = $this->getParameter('kernel.project_dir');
        echo 'With the container parameter:'.$projectDir.PHP_EOL;

        if ($projectDir !== $projectDirAlt) {
            throw new \RuntimeException('Project directories are not the same! 💥');
        }

        // Get the template content of this snippet
        $twig = file_get_contents($projectDir.'/src/Controller/Snippet/Snippet6Trait.php');

        echo $twig; // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

  Travaillez avec moi !

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @see Snippet6Trait
 */
final class Snippet6Test extends KernelTestCase
{
    private string $projectDir;

    protected function setUp(): void
    {
        $this->projectDir = self::getContainer()->getParameter('kernel.project_dir');
    }

    /**
     * @see Snippet6Trait::snippet6
     */
    public function testSnippet6(): void
    {
        self::assertSame(self::$kernel->getProjectDir(), $this->projectDir);
    }
}