126 votes

Comment obtenir le répertoire racine de l'application Symfony2 ?

Quelle est la meilleure façon d'obtenir le répertoire de l'application racine à l'intérieur du contrôleur ? Est-il possible de l'obtenir à l'extérieur du contrôleur ?

Maintenant, je l'obtiens en le passant (à partir des paramètres) au service en tant qu'argument, comme ceci :

services:

    sr_processor:
        class: Pro\Processor
        arguments: [%kernel.root_dir%]

Existe-t-il un meilleur moyen, plus simple, d'obtenir cette information dans Symfony2 ?

13 votes

Votre solution est la meilleure

4 votes

Vous mélangez un service et un contrôleur.

4 votes

Pour Symfony 3.3 et les versions ultérieures, utilisez à nouveau %kernel.project_dir% pour accéder à la racine de votre projet.

222voto

Jovan Perovic Points 6978

MISE À JOUR 2018-10-21 :

Depuis cette semaine, getRootDir() a été supprimée. Veuillez utiliser getProjectDir() à la place, comme l'a suggéré Muzaraf Ali dans la section des commentaires.

--

Utilisez ceci :

$this->get('kernel')->getRootDir();

Et si vous voulez le web Racine :

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();

Cela fonctionnera à partir de la méthode d'action du contrôleur...

EDIT : En ce qui concerne les services, je pense que la façon dont vous l'avez fait est aussi propre que possible, bien que je passerais le service complet du noyau comme argument... mais ceci fera aussi l'affaire...

3 votes

+1, mais pas précis pour symfony2. A utiliser à la place : $this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();

0 votes

Êtes-vous sûr ? J'ai utilisé avec succès ce code dans 2.0 -> 2.2 . La structure des répertoires a-t-elle été modifiée en 2.3 o master ?

36 votes

Cette solution ne convient qu'aux contrôleurs. Ici, le problème concerne les services. Quoi qu'il en soit, pourquoi passer l'élément entier juste pour obtenir une variable ? Il est bien mieux de passer seulement %kernel.root_dir%

16voto

Chris Points 761

Dans Symfony 3.3 vous pouvez utiliser

$projectRoot = $this->get('kernel')->getProjectDir();

pour obtenir la racine web/projet.

8voto

MauganRa Points 284

Si vous utilisez ce chemin pour accéder à des parties du projet qui ne sont pas du code (par exemple un répertoire de téléchargement ou une base de données SQLite), il est préférable de transformer le chemin en paramètre, comme ceci :

parameters:
    database_path: '%kernel.root_dir%/../var/sqlite3.db'

Ce paramètre peut être injecté partout où vous en avez besoin, de sorte que vous n'avez plus à vous préoccuper des chemins dans votre code. De plus, le paramètre peut être surchargé au moment du déploiement. Enfin, tout programmeur de maintenance aura une meilleure idée de la raison pour laquelle vous l'utilisez.

Mise à jour : Correction de l'utilisation de la constante kernel.root_dir.

7voto

Tragaknight Points 338

Vous pouvez également utiliser des expressions régulières :

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;

3voto

Andrew Zhilin Points 681

Depuis Symfony 3.3, vous pouvez utiliser des liens, comme

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'

Ensuite, vous pouvez utiliser le paramètre $kernelProjectDir dans n'importe quel contrôleur ou service. Tout comme

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X