La question est la suivante:
Comment puis-je obtenir le chemin du serveur du répertoire Web dans Symfony2 à partir de l'intérieur du contrôleur (ou de n'importe où ailleurs pour cette raison)
Ce que j'ai déjà trouvé (aussi, en cherchant ici):
Ceci est conseillé dans l'article du livre de recettes sur la gestion des fichiers Doctrine.
$path = __DIR__ . '/../../../../web';
Trouvé en cherchant autour de vous, utilisable uniquement depuis le contrôleur (ou le service avec le noyau injecté):
$path = $this->get('kernel')->getRootDir() . '/../web';
Alors, n'y a-t-il absolument aucun moyen d'obtenir au moins cette partie du chemin «Web»? Et si je décidais, par exemple, de le renommer ou de le déplacer?
Tout était facile dans la première symfony, quand je pouvais obtenir comme tout ce dont j'avais besoin de n'importe où dans le code en appelant la méthode statique sfConfig :: get () ..
En fait, il n’existe aucun moyen direct d’obtenir un chemin vers webdir dans Symfony2 car la structure est complètement indépendante de celle-ci.
Vous pouvez utiliser getRootDir()
sur une instance de la classe du noyau, tout comme vous écrivez. Si vous envisagez de renommer /web
dir à l'avenir, vous devriez le rendre configurable. Par exemple, AsseticBundle a une telle option dans sa configuration DI (voir ici et ici ).
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');
}
Vous pouvez également l'obtenir à partir de n'importe quelle classe ContainerAware (f.i. Controller) du service de demande:
Si vous utilisez Apache en tant que serveur Web (je suppose que pour les autres Serveurs Web, la solution serait similaire) et utilisez Virtualhosting (vos urls ressemblent à ceci - localhost/app.php
, 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();
Vous êtes sur Symfony, pensez "Injection de dépendance" ^^
Dans tout mon projet SF, je fais dans parameters.yml:
web_dir: "%kernel.root_dir%/../web"
Je peux donc utiliser ce paramètre en toute sécurité dans le contrôleur:
$this->getParameter('web_dir');
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 peut être d’ajouter une méthode statique sur AppKernel qui renvoieDIR. '/ ../web /' Vous pouvez donc accéder partout
Pour Symfony3 Dans votre contrôleur, essayez
$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
$Host = $request->server->get('HTTP_Host');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $Host.$base;
Depuis Symfony 3.3,
Vous pouvez utiliser %kernel.project_dir%/web/
au lieu de %kernel.root_dir%/../web/