web-dev-qa-db-fra.com

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

Quel est le meilleur moyen d'obtenir le répertoire de l'application racine à partir du contrôleur? Est-il possible de l'obtenir en dehors du contrôleur?

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

services:

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

Existe-t-il un moyen plus simple et meilleur d’obtenir ces informations dans Symfony2?

119
Dawid Ohia

PDATE 2018-10-21:

À compter de cette semaine, getRootDir() était obsolète. Veuillez utiliser getProjectDir() à la place, comme suggéré dans la section commentaires de Muzaraf ALi.

—-

Utilisez ceci:

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

Et si vous voulez la racine web:

$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 claire que possible, bien que je passe comme argument le service de noyau complet ... mais cela fera également l’essentiel ...

215
Jovan Perovic

Dans Symfony 3. vous pouvez utiliser

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

pour obtenir la racine web/projet.

14
Chris

Si vous utilisez ce chemin pour accéder à des parties des projets qui ne sont pas du code (par exemple, un répertoire de téléchargement ou une base de données SQLite), il peut être 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, vous n'avez donc plus à vous soucier des chemins dans votre code. En outre, le paramètre peut être remplacé au moment du déploiement. Enfin, chaque programmeur de maintenance aura une meilleure idée de l’utilisation que vous en faites.

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

8
MauganRa

Vous pouvez également utiliser une expression régulière en plus de ceci:

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