65 votes

Comment obtenir le chemin du serveur vers le répertoire Web dans Symfony2?

La question est comme suit:

Comment puis-je obtenir le chemin d'accès au serveur vers le répertoire web avec Symfony2 de l'intérieur du contrôleur (ou à partir de n'importe où ailleurs pour cette raison)

Ce que j'ai déjà trouvé (d'ailleurs, en recherchant ici):

Cela est conseillé dans l'article du cookbook sur la Doctrine de gestion des fichiers

$path = __DIR__ . '/../../../../web';

Trouvés par la recherche autour de, seulement utilisable à partir de l'intérieur du contrôleur (ou d'un service avec un noyau injecté):

$path = $this->get('kernel')->getRootDir() . '/../web';

Alors, est-il absolument impossible de les obtenir à moins que " web " une partie du chemin? Que faire si j'ai, par exemple, a décidé de le renommer ou de déplacer ou de quelque chose?

Tout a été facile dans la première symfony, quand j'ai pu obtenir comme tout ce que je nécessaire à partir de n'importe où dans le code par l'appel de la statique sfConfig::get() la méthode..

47voto

Martin Points 541

Il n'existe pas de moyen direct d'obtenir le chemin à webdir dans Symfony2 comme le cadre est totalement indépendant sur webdir.

Vous pouvez utiliser getRootDir() sur instance de la classe kernel, comme vous l'écrivez. Si vous envisager de renommer /web dir dans l'avenir, vous devez le rendre configurable. Par exemple AsseticBundle a une option dans ses DI configuration (voir ici et ici).

44voto

redjam13 Points 315

Pour accéder au répertoire racine de l'extérieur du contrôleur, vous pouvez simplement injecter '% kernel.root_dir%' en tant qu'argument dans la configuration de vos services.

 service_name:
    class: Namespace\Bundle\etc
    arguments: ['%kernel.root_dir%']
 

Ensuite, vous pouvez obtenir la racine Web dans le constructeur de la classe:

 public function __construct($rootDir)
{
    $this->webRoot = realpath($rootDir . '/../web');
}
 

18voto

Molecular Man Points 15187

Vous pouvez également l'obtenir à partir de n'importe quelle classe ContainerAware (contrôleur fi) du service de requête:

  • Si vous utilisez apache en tant que serveur Web (je suppose que la solution serait similaire pour d'autres serveurs Web) et utilisez virtualhosting (vos URL ressemblent à ceci - localhost/app.php alors vous pouvez utiliser:

     $container->get('request')->server->get('DOCUMENT_ROOT');
    // in controller:
    $this->getRequest()->server->get('DOCUMENT_ROOT');
     
  • Sinon (vos urls ressemblent à ceci - localhost/path/to/Symfony/web/app.php :

     $container->get('request')->getBasePath();
    // in controller:
    $this->getRequest()->getBasePath();
     

12voto

noel Points 127

Ma solution est d'ajouter ce code au fichier app.php

 define('WEB_DIRECTORY', __DIR__);
 

Le problème est que, dans le code de ligne de commande qui utilise la constante, les résultats seront brisés. Vous pouvez également ajouter la constante au fichier app / console et aux autres contrôleurs frontaux de l'environnement.

Une autre solution consiste à ajouter à AppKernel une méthode statique qui renvoie DIR . '/ .. / web /' Vous pouvez donc accéder partout.

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