2015-12-17 9 views
9

私はSensioLabs Insightを使用してコード品質を制御します。symfonyで絶対パス定数__DIR__と__FILE__を使用しないでください

単純なファイルのアップロードについては

、私は私のアップロードディレクトリの絶対パスを取得する必要があります。直接、公式ドキュメントから来る

protected function getUploadRootDir() 
{ 
    // the absolute directory path where uploaded 
    return __DIR__.'/../../../../web/'.$this->getUploadDir(); 
} 

コード(How to handle file uploads with Doctrine

しかしSLInsightは、コードの場合、警告を発生させます分析さ__DIR__または__FILE__ PHPの魔法の定数が含まれています

__DIR____FILE__定数がSymfonyリソースオーバーライドシステムと競合する可能性があります。この定数の使用量がsymfonyで競合が発生することができますどのように

そして、どのように私は私のコードでそれらを避けることができますか?

+1

タイトルは誤解を招くです。 **絶対パス定数 '__FILE__'と' __DIR__'を一般的に使用することが推奨されています**。 Symfonyのファイルロケータは、プロジェクトでSymfony(またはファイルロケータ)*を使用する場合にのみ使用してください*。 – axiac

+0

右に更新しました。正直に言うと、あなたに – chalasr

+0

をありがとう、私はそのコードを見たら、私の反応は「より良い方法があるように持っている」ことになります。あなたは、あなたが望むパスがちょうど4レベル上であることをハードコーディングしています。そして、「ウェブ」と呼ばれるディレクトリ、そしてダイナミックなセグメントです。それは非常に壊れやすく、柔軟性がないように見えます。確かに、この全体のパスは、特定のベースに対してどこかで設定する必要があります。 – IMSoP

答えて

11

ファイルアップロードクラスの場合、このエラーメッセージは無視される可能性があります。しかし、それ以外の場合は、ファイルパスをハードコーディングする代わりにSymfonyファイルロケータを使用する方が良いでしょう。たとえば、次のように

$path = $this->get('kernel')->locateResource('@AppBundle/Resources/config/services.xml'); 

の代わりに:

$path = __DIR__.'/../../../src/Acme/AppBundle/Resources/config/services.xml' 
+0

こんにちはMr Eguiluz、エンティティモデルでこのコードを使用するのは正しいですか? (*私は、カーネルや他のサービスを呼び出すことがモデル内で非常にきれいではないと思っていました。*) – pbenard

+3

エンティティからアップロードディレクトリを取得することは、すでにクリーンではないと言います。エンティティは、アップロードされたファイルがどこに保存されているかを知る責任を負うべきではありません(例えば、ローカルではないかもしれませんが、S3の場合) –

+0

この説明をありがとうMr、素晴らしい**ありがとうございます。 – pbenard

7

実際、これはSensioLabs Insightが正しく処理しないものです。 それは理由リソースオーバーライドシステムの定数を使用しないことを警告しているが、多くの場合には、これらの定数は、リソースオーバーライドシステムに関係のない場所で使用されている(これはここにおそらくあなたのコードの場合です)。したがって、この場合の警告を無視することができます

+0

今朝、ユニットテストで警告が発せられました。このルールは、symfonyリソースオーバーライドシステムを使用できるクラスに制限する必要があります。 http://prnt.sc/aa68cw – chalasr

0

サードパーティのバンドルを作成し、いくつかのリソースを検索したい場合は、@Javierによって提案された(良い)ソリューションはそれとして適用されていませんこの場合

ServiceNotFoundException in ContainerBuilder.php line 816: 
You have requested a non-existent service "kernel". 

溶液は$this->getPath()を使用することで、Symfony\Component\HttpKernel\Bundle\Bundle CからBundleNameBundleによって継承されたメソッド:例外をスローラス。

これはrealpath(__DIR__)と同じ結果を返します。

$this->getPath() . '/Resources/config/doctrine/mappings'を実行すると、realpath(__DIR__ . '/Resources/config/doctrine/mappings')と同じになります。

hereが最初に提案しました。

+0

'kernel'サービスはコンパイル時に利用できません(最初は合成されているため)。コンパイラパスからは使用できませんが、実際にはすべてのランタイムコンテキストから正常に動作します。ここでコンテキストはエンティティであるため、サービスを使用すべきではありません。私のエンティティはBundleインスタンスではないので、getPathは利用できません。だから、前の2つの答えに記載されているように警告を無視すると、私が推測する最良の解決策が残ります – chalasr

+0

はい、私は知っています。この質問は、バンドル作成コンテキストで問題を探すときに表示されるので、私は答えを追加しました。しかし、ここで提案されている解決策は適切ではありません。だから私は答えを追加したので、バンドル作成のコンテキストで解決策を探している人は、とにかく見つけることができます。内部リンク用です... – Aerendir

関連する問題