Wie erhalte ich das Root-Verzeichnis der Symfony2-Anwendung?

121

Was ist der beste Weg, um das Root-App-Verzeichnis aus dem Controller heraus abzurufen? Ist es möglich, es außerhalb des Controllers zu bekommen?

Jetzt erhalte ich es, indem ich es (von Parametern) als Argument wie folgt an den Dienst übergebe:

services:

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

Gibt es eine bessere und einfachere Möglichkeit, diese Informationen in Symfony2 abzurufen?

Dawid Ohia
quelle
13
Ihre Lösung ist am besten
Inoryy
4
Sie mischen einen Dienst und einen Controller yo
John Smith
4
Wieder für Symfony 3.3 und höher %kernel.project_dir%, um zum Root Ihres Projekts zu gelangen.
Muzafar Ali
1
["%kernel.root_dir%"]
Stellen Sie

Antworten:

220

UPDATE 2018-10-21:

Ab dieser Woche getRootDir()war veraltet. Bitte verwenden Sie getProjectDir()stattdessen, wie im Kommentarbereich von Muzaraf Ali vorgeschlagen.

-

Benutze das:

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

Und wenn Sie das Webstamm möchten :

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

Dies funktioniert mit der Controller-Aktionsmethode ...

EDIT: Was die Dienste betrifft, denke ich, dass die Art und Weise, wie Sie es getan haben, so sauber wie möglich ist, obwohl ich als Argument den vollständigen Kernel-Dienst übergeben würde ... aber dies wird auch den Trick tun ...

Jovan Perovic
quelle
3
+1, aber nicht genau für symfony2. Verwenden Sie stattdessen:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian
36
Diese Lösung ist nur für Steuerungen geeignet. Hier geht es um Dienstleistungen. Wie auch immer, warum den gesamten Container übergeben, um eine Variable zu erhalten? Es ist weitaus besser, nur% kernel.root_dir%
Massimiliano Arione
2
Massimiliano hat recht, und als Ergänzung verwende ich $this->container->getParameter('kernel.cache_dir')in Controllern anstelle der von Ihnen bereitgestellten Lösung
lackovic10
2
Dies war mehr das Thema Ihres Dienstes, der containerinjiziert wurde :) Wenn Sie Best Practices befolgen, containersollte das Injizieren um jeden Preis vermieden werden. Was die Lösung zum Abrufen des webVerzeichnisses betrifft , verwende ich immer noch das oben angegebene;)
Jovan Perovic
4
Ab Symfony 3.3 und %kernel.project_dir%/web/%kernel.root_dir%/../web/
höher
15

In Symfony 3.3 können Sie verwenden

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

um das Web / Projekt-Root zu bekommen.

Chris
quelle
8

Wenn Sie diesen Pfad verwenden, um auf Teile der Projekte zuzugreifen, die kein Code sind (z. B. ein Upload-Verzeichnis oder eine SQLite-Datenbank), ist es möglicherweise besser, den Pfad in einen Parameter wie den folgenden umzuwandeln:

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

Dieser Parameter kann überall dort eingefügt werden, wo Sie ihn benötigen, sodass Sie nicht mehr mit Pfaden in Ihrem Code herumspielen müssen. Außerdem kann der Parameter zur Bereitstellungszeit überschrieben werden. Schließlich hat jeder Wartungsprogrammierer eine bessere Vorstellung davon, wofür Sie es verwenden.

Update: Konstante Verwendung von kernel.root_dir behoben.

MauganRa
quelle
6

Darüber hinaus können Sie auch reguläre Ausdrücke verwenden:

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

Seit Symfony 3.3 können Sie Bindungen verwenden, wie z

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

Danach können Sie den Parameter $ kernelProjectDir in jedem Controller ODER Dienst verwenden. So wie

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Andrew Zhilin
quelle