Come ottenere la directory root dell'applicazione Symfony2?


121

Qual è il modo migliore per ottenere la directory dell'app root dall'interno del controller? È possibile ottenerlo al di fuori del controller?

Ora lo ottengo passandolo (dai parametri) al servizio come argomento, in questo modo:

services:

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

Esiste un modo migliore e più semplice per ottenere queste informazioni in Symfony2?


13
la tua soluzione è la migliore
Inoryy

4
stai confondendo un servizio e un controller yo
john Smith

4
Anche in questo caso per Symfony 3.3 e successivi utilizzare %kernel.project_dir%per accedere alla radice del progetto.
Muzafar Ali

1
assicurati di racchiudere i letterali tra virgolette: ["%kernel.root_dir%"]
ochitos

Risposte:


220

AGGIORNAMENTO 21/10/2018:

A partire da questa settimana, è getRootDir()stato deprecato. Si prega di utilizzare getProjectDir()invece, come suggerito nella sezione commenti di Muzaraf Ali.

-

Usa questo:

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

E se vuoi la radice web :

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

questo funzionerà dal metodo di azione del controller ...

EDIT: Per quanto riguarda i servizi, penso che il modo in cui hai fatto sia il più pulito possibile, anche se passerei il servizio completo del kernel come argomento ... ma questo farà anche il trucco ...


3
+1 ma non accurato per symfony2. Usa invece:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian il

36
Questa soluzione è adatta solo per i controller. Qui il problema riguarda i servizi. Ad ogni modo, perché passare l' intero contenitore solo per ottenere una variabile? È molto meglio passare solo% kernel.root_dir%
Massimiliano Arione

2
Massimiliano ha ragione, e in aggiunta, uso $this->container->getParameter('kernel.cache_dir')nei controller al posto della soluzione che hai fornito
Lackovic10

2
Questo era più sull'argomento del tuo servizio che è stato containeriniettato :) Se segui le migliori pratiche, l'iniezione containerdovrebbe essere evitata a tutti i costi. Per quanto riguarda la soluzione per ottenere la webdirectory, utilizzo ancora quella che ho fornito sopra;)
Jovan Perovic

4
A partire da Symfony 3.3 e successivi, utilizzare %kernel.project_dir%/web/invece di%kernel.root_dir%/../web/
Muzafar Ali

15

In Symfony 3.3 puoi usare

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

per ottenere la radice del progetto / web.


8

Se stai utilizzando questo percorso per accedere a parti dei progetti che non sono codice (ad esempio una directory di caricamento o un database SQLite), potrebbe essere meglio trasformare il percorso in un parametro, come questo:

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

Questo parametro può essere iniettato ovunque ti serva, quindi non devi più scherzare con i percorsi nel tuo codice. Inoltre, il parametro può essere sovrascritto al momento della distribuzione. Infine, ogni programmatore manutentore avrà un'idea migliore per cosa lo stai usando.

Aggiornamento: corretto l'utilizzo costante di kernel.root_dir.


6

Puoi anche usare espressioni regolari oltre a questo:

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

2

A partire da Symfony 3.3 puoi usare il binding, come

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

Dopodiché puoi usare il parametro $ kernelProjectDir in qualsiasi controller OR servizio. Proprio come

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.