Jak zdobyć katalog główny aplikacji Symfony2?

121

Jaki jest najlepszy sposób uzyskania katalogu głównego aplikacji z wnętrza kontrolera? Czy można go uzyskać poza kontrolerem?

Teraz otrzymuję go, przekazując go (z parametrów) do usługi jako argument, na przykład:

services:

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

Czy istnieje lepszy, prostszy sposób uzyskania tych informacji w Symfony2?

Dawid Ohia
źródło
13
Twoje rozwiązanie jest najlepsze
Inoryy,
4
mylisz usługę i kontroler, yo
John Smith
4
Ponownie dla Symfony 3.3 i nowszych użyj, %kernel.project_dir%aby dostać się do katalogu głównego projektu.
Muzafar Ali
1
pamiętaj, aby umieścić literały w cudzysłowie: ["%kernel.root_dir%"]
ochitos

Odpowiedzi:

220

AKTUALIZACJA 21.10.2018:

Od tego tygodnia getRootDir()został wycofany. Użyj getProjectDir()zamiast tego, jak zasugerował w sekcji komentarzy Muzaraf Ali.

—-

Użyj tego:

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

A jeśli chcesz mieć katalog główny sieci :

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

to zadziała z metody akcji kontrolera ...

EDYCJA: Jeśli chodzi o usługi, myślę, że sposób, w jaki to zrobiłeś, jest tak czysty, jak to tylko możliwe, chociaż przekazałbym pełną usługę jądra jako argument ... ale to też załatwi sprawę ...

Jovan Perovic
źródło
3
+1, ale niedokładne dla symfony2. Użyj zamiast tego:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian
36
To rozwiązanie jest odpowiednie tylko dla kontrolerów. Tutaj problem dotyczy usług. W każdym razie, po co przekazywać cały kontener tylko po to, aby uzyskać zmienną? O wiele lepiej jest przekazać tylko% kernel.root_dir%
Massimiliano Arione
2
Massimiliano ma rację i jako dodatek używam $this->container->getParameter('kernel.cache_dir')w kontrolerach zamiast rozwiązania, które
podałeś
2
To było bardziej na temat containerwstrzyknięcia przez twoją usługę :) Jeśli postępujesz zgodnie z najlepszymi praktykami, wstrzykiwania containernależy unikać za wszelką cenę. Jeśli chodzi o rozwiązanie pobierania webkatalogu, nadal korzystam z tego, który podałem powyżej;)
Jovan Perovic
4
Od Symfony 3.3 i nowszych używaj %kernel.project_dir%/web/zamiast%kernel.root_dir%/../web/
Muzafar Ali
15

W Symfony 3.3 możesz użyć

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

aby uzyskać katalog główny sieci / projektu.

Chris
źródło
8

Jeśli używasz tej ścieżki, aby uzyskać dostęp do części projektów, które nie są kodem (na przykład katalog uploadu lub baza danych SQLite), może być lepiej, aby zmienić ścieżkę w parametr, na przykład:

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

Ten parametr można wstrzyknąć wszędzie tam, gdzie go potrzebujesz, więc nie musisz już mieszać ze ścieżkami w kodzie. Ponadto parametr można zastąpić w czasie wdrażania. Wreszcie, każdy utrzymujący programista będzie miał lepsze pojęcie, do czego go używasz.

Aktualizacja: Naprawiono stałe użycie kernel.root_dir.

MauganRa
źródło
6

Oprócz tego możesz również użyć wyrażenia regularnego:

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;
Tragaknight
źródło
2

Od Symfony 3.3 możesz używać wiązania, na przykład

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

Następnie możesz użyć parametru $ kernelProjectDir w dowolnym kontrolerze LUB usłudze. Tak jak

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Andrew Zhilin
źródło