web-dev-qa-db-ja.com

コントローラ内からSymfony2のWebディレクトリへのサーバーパスを取得する方法は?

質問は次のとおりです。

Symfony2のWebディレクトリへのサーバーパスをコントローラー内から(またはそのため他の場所から)取得するにはどうすればよいですか

私がすでに見つけたもの(また、ここで検索することにより):

これは、Doctrineファイル処理に関するクックブックの記事で推奨されています

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

周りを検索することで見つかり、コントローラー(またはカーネルが挿入されたサービス)内からのみ使用できます。

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

だから、少なくともその「ウェブ」の部分をパスする方法はまったくありませんか?たとえば、名前を変更したり、移動したりすることを決めた場合はどうなりますか?

最初のsymfonyでは、すべてが簡単でした。静的なsfConfig :: get()メソッドを呼び出すことで、コードのどこからでも必要なものをすべて取得できました。

63
Sylvix

フレームワークはwebdirから完全に独立しているため、Symfony2でwebdirへのパスを取得する直接的な方法は実際にはありません。

書いているように、カーネルクラスのインスタンスでgetRootDir()を使用できます。 /web dirの名前を将来変更することを検討する場合は、構成可能にする必要があります。たとえば、AsseticBundleのDI設定にはこのようなオプションがあります( here および here を参照)。

47
Martin

コントローラの外部からルートディレクトリにアクセスするには、サービス構成の引数として%kernel.root_dir%を挿入するだけです。

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

次に、クラスコンストラクターでWebルートを取得できます。

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

リクエストサービスのContainerAware(f.i. Controller)クラスからも取得できます。

  • ApacheをWebサーバーとして使用している場合(他のWebサーバーの場合も同様のソリューションになると思います)、仮想ホスティングを使用している場合(URLはlocalhost/app.phpのようになります)。

    $container->get('request')->server->get('DOCUMENT_ROOT');
    // in controller:
    $this->getRequest()->server->get('DOCUMENT_ROOT');
    
  • それ以外(URLは次のようになります-localhost/path/to/Symfony/web/app.php

    $container->get('request')->getBasePath();
    // in controller:
    $this->getRequest()->getBasePath();
    
17
Molecular Man

あなたはSymfonyを使っています、「依存性注入」と思います^^

私のすべてのSFプロジェクトでは、parameters.ymlで次のことを行います。

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

したがって、コントローラー内でこのパラメーターを安全に使用できます。

$this->getParameter('web_dir');
15
Thomas Decaux

私の解決策は、このコードをapp.phpに追加することです

define('WEB_DIRECTORY', __DIR__);

問題は、定数を使用するコマンドラインコードで破損することです。定数をapp/consoleファイルと他の環境フロントコントローラーに追加することもできます

別の解決策は、AppKernelにDIR。 '/ ../web /'を返す静的メソッドを追加することです。したがって、どこからでもアクセスできます。

12
noel

更新:2.8以降、デフォルトでasseticが含まれなくなったため、これは機能しなくなりました。資産を使用している場合、これは動作しますが。

変数%assetic.write_to%.を使用できます

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

アセットはこの変数に依存してWebディレクトリにダンプされるため、Webフォルダーを見つけるために想定して使用しても安全です。

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

12
Tek

Symfony3の場合コントローラーで試してください

$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
2
utkarsh2k2
$Host = $request->server->get('HTTP_Host');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $Host.$base;
0
Ashok

Symfony 3.3以降、

%kernel.project_dir%/web/の代わりに%kernel.root_dir%/../web/を使用できます

0
Tsounabe