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

Publié le 28/10/2018 • Mis à jour 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 🇬🇧

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
        //$rootDir = \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  ≪ showUnitTestButtonLabel ≫  Plus sur Stackoverflow   Lire la doc

<?php declare(strict_types=1);

namespace App\Tests\Controller\Snippets;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

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

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

    /**
     * @covers Snippet6Trait::snippet6()
     *
     * @see https://www.strangebuzz.com/en/snippets/get-the-symfony-project-root-directory
     */
    public function testSnippet6(): void
    {
        $this->assertSame(self::$kernel->getProjectDir(), $this->projectDir);
    }
}