Symfony2アプリケーションのルートディレクトリを取得する方法


121

コントローラー内からルートアプリディレクトリを取得する最良の方法は何ですか?コントローラの外に出すことはできますか?

次のように、(パラメーターから)引数としてサービスに渡すことで取得します。

services:

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

Symfony2でこの情報を取得するためのより良い、より簡単な方法はありますか?


13
あなたのソリューションは最高です
Inoryy

4
youreがサービスとコントローラーを混ぜるよ
ジョン・スミス

4
再びSymfony 3.3以降%kernel.project_dir%では、プロジェクトのルートに到達するために使用します。
Muzafar Ali

1
引用符でリテラルをカプセル化するようにしてください: ["%kernel.root_dir%"]
ochitos

回答:


220

更新2018-10-21:

今週の時点で、getRootDir()は廃止されました。getProjectDir()Muzaraf Aliのコメントセクションで提案されているように、代わりに使用してください。

-

これを使って:

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

そして、もしあなたがウェブルートが欲しいなら:

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

これはコントローラーアクションメソッドから機能します...

編集:サービスについては、完全なカーネルサービスを引数として渡しますが、あなたがそれをした方法は可能な限りクリーンだと思います...しかしこれはまたトリックをします...


3
+1ですが、symfony2では正確ではありません。代わりに使用してください:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
セバスチャン

36
このソリューションは、コントローラーにのみ適しています。ここで問題はサービスについてです。とにかく、なぜ変数を取得するためだけにコンテナ全体を渡すのですか?%kernel.root_dir%だけを渡す方がはるかに良い
Massimiliano Arione '10

2
Massimilianoは正しい、そして追加として、私は$this->container->getParameter('kernel.cache_dir')あなたが提供したソリューションの代わりにコントローラーで使用している
lacovic10

2
これは、サービスがcontainer注入されたというトピックに関するものでした:)ベストプラクティスに従っている場合、注入はcontainer絶対に回避する必要があります。webディレクトリを取得するソリューションについては、私はまだ上記で提供したものを使用しています;)
Jovan Perovic

4
Symfony 3.3以降では、%kernel.project_dir%/web/代わりに使用します%kernel.root_dir%/../web/
Muzafar Ali

15

Symfony 3.3で使用できます

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

Web /プロジェクトのルートを取得します。


8

このパスを使用して、コードではないプロジェクトの一部(アップロードディレクトリ、SQLiteデータベースなど)にアクセスする場合は、次のようにパスをパラメーターに変換することをお勧めします。

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

このパラメーターは必要な場所に挿入できるため、コード内のパスをいじる必要はありません。また、パラメーターはデプロイメント時にオーバーライドできます。最後に、すべての保守プログラマーは、何のためにそれを使用しているのかについてより良い考えを持っています。

更新:kernel.root_dir定数の使用法を修正しました。


6

これに加えて正規表現を使用することもできます:

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

2

Symfony 3.3以降では、次のようにバインディングを使用できます

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

その後、任意のコントローラーまたはサービスでパラメーター$ kernelProjectDirを使用できます。と同じように

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.