質問は次のとおりです。
Symfony2のWebディレクトリへのサーバーパスをコントローラー内から(またはそのため他の場所から)取得するにはどうすればよいですか
私がすでに見つけたもの(また、ここで検索することにより):
これは、Doctrineファイル処理に関するクックブックの記事で推奨されています
$path = __DIR__ . '/../../../../web';
周りを検索することで見つかり、コントローラー(またはカーネルが挿入されたサービス)内からのみ使用できます。
$path = $this->get('kernel')->getRootDir() . '/../web';
だから、少なくともその「ウェブ」の部分をパスする方法はまったくありませんか?たとえば、名前を変更したり、移動したりすることを決めた場合はどうなりますか?
最初のsymfonyでは、すべてが簡単でした。静的なsfConfig :: get()メソッドを呼び出すことで、コードのどこからでも必要なものをすべて取得できました。
コントローラの外部からルートディレクトリにアクセスするには、サービス構成の引数として%kernel.root_dir%
を挿入するだけです。
service_name:
class: Namespace\Bundle\etc
arguments: ['%kernel.root_dir%']
次に、クラスコンストラクターでWebルートを取得できます。
public function __construct($rootDir)
{
$this->webRoot = realpath($rootDir . '/../web');
}
リクエストサービスの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();
あなたはSymfonyを使っています、「依存性注入」と思います^^
私のすべてのSFプロジェクトでは、parameters.ymlで次のことを行います。
web_dir: "%kernel.root_dir%/../web"
したがって、コントローラー内でこのパラメーターを安全に使用できます。
$this->getParameter('web_dir');
私の解決策は、このコードをapp.phpに追加することです
define('WEB_DIRECTORY', __DIR__);
問題は、定数を使用するコマンドラインコードで破損することです。定数をapp/consoleファイルと他の環境フロントコントローラーに追加することもできます
別の解決策は、AppKernelにDIR。 '/ ../web /'を返す静的メソッドを追加することです。したがって、どこからでもアクセスできます。
更新:2.8以降、デフォルトでasseticが含まれなくなったため、これは機能しなくなりました。資産を使用している場合、これは動作しますが。
変数%assetic.write_to%.
を使用できます
$this->getParameter('assetic.write_to');
アセットはこの変数に依存してWebディレクトリにダンプされるため、Webフォルダーを見つけるために想定して使用しても安全です。
http://symfony.com/doc/current/reference/configuration/assetic.html
Symfony3の場合コントローラーで試してください
$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
$Host = $request->server->get('HTTP_Host');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $Host.$base;
Symfony 3.3以降、
%kernel.project_dir%/web/
の代わりに%kernel.root_dir%/../web/
を使用できます