Récupérer le répertoire racine d'un projet Symfony
Publié le 28/10/2018 • Actualisé le 08/12/2019
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
<?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);
}
}