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

121

Quelle est la meilleure façon d'obtenir le répertoire racine de l'application depuis le contrôleur? Est-il possible de le sortir 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 moyen meilleur et plus simple d'obtenir ces informations dans Symfony2?

Dawid Ohia
la source
13
votre solution est la meilleure
Inoryy
4
vous mélangez un service et un contrôleur yo
john Smith
4
Encore une fois pour Symfony 3.3 et les versions ultérieures, utilisez %kernel.project_dir%pour accéder à la racine de votre projet.
Muzafar Ali
1
assurez-vous d'encapsuler les littéraux entre guillemets: ["%kernel.root_dir%"]
ochitos

Réponses:

220

MISE À JOUR 2018-10-21:

À partir de cette semaine, getRootDir()était obsolète. Veuillez utiliser à la getProjectDir()place, comme suggéré dans la section des 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 propre que possible, même si je passerais le service complet du noyau comme argument ... mais cela fera également l'affaire ...

Jovan Perovic
la source
3
+1 mais pas précis pour symfony2. Utilisez à la place:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian
36
Cette solution ne convient qu'aux contrôleurs. Ici, le problème concerne les services. Quoi qu'il en soit, pourquoi passer le conteneur entier juste pour obtenir une variable? Il est de loin préférable de passer juste% kernel.root_dir%
Massimiliano Arione
2
Massimiliano a raison, et en plus, j'utilise $this->container->getParameter('kernel.cache_dir')dans les contrôleurs au lieu de la solution que vous avez fournie
manqueovic10
2
C'était plus sur le sujet de votre service ayant containerinjecté :) Si vous suivez les meilleures pratiques, l'injection containerdoit être évitée à tout prix. Quant à la solution pour obtenir le webrépertoire, j'utilise toujours celle que j'ai fournie ci-dessus;)
Jovan Perovic
4
À partir de Symfony 3.3 et %kernel.project_dir%/web/au%kernel.root_dir%/../web/
delà
15

Dans Symfony 3.3, vous pouvez utiliser

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

pour obtenir la racine web / projet.

Chris
la source
8

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 de la constante kernel.root_dir.

MauganRa
la source
6

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

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

Depuis Symfony 3.3, vous pouvez utiliser la liaison, comme

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

Après cela, vous pouvez utiliser le paramètre $ kernelProjectDir dans n'importe quel contrôleur OU service. Juste comme

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Andrew Zhilin
la source