2012-02-09 17 views
109

Qual è il modo migliore per ottenere la directory dell'app root dal controller? È possibile farlo fuori dal controller?Come ottenere la directory principale dell'applicazione Symfony2?

Adesso capisco passandolo (dai parametri) per il servizio come argomento, come questo:

services: 

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

C'è una migliore, modo più semplice per ottenere queste informazioni in Symfony2?

+11

la tua soluzione è la migliore – Inoryy

+4

stai mescolando un servizio e un controller yo –

+2

Ancora per Symfony 3.3 e in poi usa '% kernel.project_dir%' per arrivare alla radice del tuo progetto. –

risposta

199

Utilizzare questa:

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

E se si desidera che il web radice:

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

questo sarà il lavoro da metodo di azione del controller ...

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

+3

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

+0

Sei sicuro? Ho usato con successo questo codice in '2.0' ->' 2.2'. La struttura della directory è stata modificata in '2.3' o' master'? –

+34

Questa soluzione è adatta solo per i controller. Qui il problema riguarda i servizi. Ad ogni modo, perché passare il contenitore * whole * solo per ottenere una variabile? È molto meglio passare solo% kernel.root_dir% –

6

È inoltre possibile utilizzare espressioni regolari, oltre a questo:

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

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

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

questo parametro può essere iniettato ovunque ne avete bisogno, in modo da non dover pasticciare in giro con percorsi nel tuo codice più. Inoltre, il parametro può essere ignorato al momento della distribuzione. Infine, ogni programmatore di mantenimento avrà un'idea migliore per cosa lo sta usando.

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

5

In Symfony 3.3 è possibile utilizzare

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

per ottenere la principale web/del progetto.

+1

Grazie! Adoro le persone che leggono le note di rilascio))) –

Problemi correlati