web-dev-qa-db-ja.com

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

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

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

services:

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

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

119
Dawid Ohia

PDATE 2018-10-21:

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

-

これを使って:

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

web rootが必要な場合:

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

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

編集:サービスに関しては、完全なカーネルサービスを引数として渡しますが、あなたがそれをした方法は可能な限りきれいであると思います...

214
Jovan Perovic

Symfony 3. を使用できます

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

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

14
Chris

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

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

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

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

8
MauganRa

これに加えて、正規表現も使用できます。

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