2012-02-13 9 views
57

Pytanie brzmi następująco:Jak uzyskać ścieżkę serwera do katalogu internetowego w Symfony2 z poziomu kontrolera?

Jak mogę uzyskać ścieżkę do katalogu serwera WWW w Symfony2 od wewnątrz sterownika (lub gdziekolwiek indziej z tego powodu)

co już stwierdzono (także , szukając tutaj):

To jest zalecane w artykule książki kucharskiej Obchodzenie pliku Doctrine

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

Znaleziony przez wyszukiwanie wokół, nadające się tylko od wewnątrz regulatora (lub usługi z ker nel injected):

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

Czy nie ma absolutnie żadnego sposobu, aby zdobyć chociaż część "sieci"? Co się stanie, jeśli na przykład zdecyduję się zmienić nazwę lub przenieść lub coś takiego?

Wszystko było łatwe w pierwszym symfony, kiedy mogę dostać jak wszystko, co potrzebne z dowolnego miejsca w kodzie przez wywołanie :: get metody statyczne sfConfig() ..

+0

miałem ten sam problem i musiał użyć getRootDir(). NAPRAWDĘ jest irytujące, że nie możesz uzyskać pełnej ścieżki do folderu/web! : P – ddtpoison777

Odpowiedz

43

Jest rzeczywiście żaden bezpośredni sposób uzyskać ścieżkę do webdir w Symfony2, ponieważ framework jest całkowicie niezależny od webdiru.

Możesz użyć getRootDir() na instancji klasy jądra, tak jak piszesz. Jeśli weźmiesz pod uwagę zmianę nazwy /web w przyszłości, powinieneś ustawić ją jako konfigurowalną. Na przykład AsseticBundle ma taką opcję w swojej konfiguracji DI (patrz here i here).

+1

Dziękuję. Chciałem użyć metody getRootDir, jeśli nic więcej nie pojawiło się, wydaje się, że jest to najrozsądniejsza i najbardziej uniwersalna metoda. – Sylvix

15

Można również uzyskać z dowolnego ContainerAware (fi Controller) Klasa z usługi żądanie:

  • Jeśli używasz Apache jako serwer WWW (przypuszczam, że dla drugiej serwerach rozwiązaniem byłby podobny) i korzystania virtualhosting (adresy URL wyglądać tak - localhost/app.php następnie można użyć:

    $container->get('request')->server->get('DOCUMENT_ROOT'); 
    // in controller: 
    $this->getRequest()->server->get('DOCUMENT_ROOT'); 
    
  • Else (adresy URL wyglądać tak - localhost/path/to/Symfony/web/app.php:

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

Dzięki za odpowiedź. Ale haczyk polega na tym, że nie jestem jedynym programistą w projekcie i wiem na pewno, że niektórzy z nich nie używają wirtualnych hostów, a niektórzy nie, ja włącznie. Tak więc rozwiązanie powinno być bardziej uniwersalne niż to ... Dlatego (i biorąc pod uwagę drugą odpowiedź) prawdopodobnie użyję metody getRootDir() jako bardziej uniwersalnej. – Sylvix

+0

Jeśli chcesz uzyskać katalog bez kontekstu żądania, ten nie będzie działał, prawda? Jak polecenia? – tom10271

10

Moje rozwiązanie jest dodanie tego kodu do app.php

define('WEB_DIRECTORY', __DIR__); 

Problemem jest to, że w linii poleceń kodu, który wykorzystuje stałą złamie. Można również dodać Stała do pliku/app konsoli i innym środowisku kontrolerów przednie

Innym rozwiązaniem może być dodanie metody statyczne w AppKernel zwracającej DIR. „/ ../web /” Więc można uzyskać dostęp Wszędzie

39

Aby uzyskać dostęp do katalogu głównego spoza kontrolera, wystarczy wprowadzić %kernel.root_dir% jako argument w konfiguracji usług.

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

Następnie można uzyskać pierwiastek internetową w konstruktorze klasy:

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

UPDATE: Od 2,8 to już nie działa, ponieważ assetic nie jest już włączone domyślnie. Chociaż jeśli używasz aktywów, to zadziała.

Można użyć zmiennej %assetic.write_to%.

$this->getParameter('assetic.write_to');

Od swoje aktywa zależy od tej zmiennej do zatopienia do katalogu stron internetowych, to bezpiecznie przyjąć i wykorzystać, aby zlokalizować folder internetowej.

http://symfony.com/doc/current/reference/configuration/assetic.html

8

Jesteś na Symfony, myśleć "Dependency Injection" ^^

W całym moim projekcie SF, robię w parameters.yml:

web_dir: "%kernel.root_dir%/../web" 

Więc mogę bezpiecznie korzystać ten parametr w kontrolerze:

$this->getParameter('web_dir'); 
0

Dla Symfony3 W kontrolerze spróbować

$request->server->get('DOCUMENT_ROOT').$request->getBasePath() 
0
$host = $request->server->get('HTTP_HOST'); 
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : ''; 
$getBaseUrl = $host.$base; 
+0

Czy nie jest to potrzebne do uzyskania adresu URL żądania, a nie do ścieżki systemu plików, tak jak pytano? –

Powiązane problemy