2017-09-19 6 views
1

私はajax投稿経由で自分のルートに変数を送ります。私type値の値に基づいて、私はこのように、新しいオブジェクトを作成します。symfony3/PHPで文字列変数で新しいオブジェクトを作成

if($request->get('type') === 'HardwareType'){ 
    $e = new HardwareType(); 
}else if($request->get('type') === 'SetupType'){ 
    $e => new SetupType(); 
}else{ 
    new NotFoundHttpException(); 
} 

これは私がそのまだ「醜い」を考えてすぐにでもswitchと手に負えなくなります。私はsthを行うことができる方法はありますか?このように:あなたはあなたが必要な場合は

$e = $request->get('type'); 
$class = new $e(); 

$e = new $request->get('type')(); 

は、任意のヒントが

はEDIT私は

+0

なぜ、コンテナを使用しないか、各クラス(またはサービスなど)に別名を付けることができます。 'new HardwareType'を実行する代わりに' $ container-> get( 'class_service_whatever_id');を使うことができます; – Andrew

答えて

3

あなたがこれを行うことができ、このuse AppBundle\Entity\HardwareType;などでクラス(複数可)を使用して感謝しました次のようにパスまたはクラスを追加できます。

$e = 'AppBundle\Entity\' . $request->get('type'); 
明らか

あなたは、ファイルの開始時にuseを追加する必要があり、クラスはこのように

存在しないかどうかをnewする前に確認することができます。

if (!class_exists($e)) { 
    //exception 
} 
+0

チェックなしで失敗する可能性があります – delboy1978uk

+0

はい私はすでに今すぐ回答を更新しています –

+0

ハッカーはこれを脆弱なComposerライブラリ – Pete

2

だけで連想配列を使用します!許可したくないクラスのインスタンスをインスタンス化できないように、受け入れ可能なクラスを定義します。

次に、キーが配列内にあるかどうかを確認し、そうであれば新しいWhatever()を作成します。

$types = [ 
    'HardwareType' => HardwareType::class, 
    'etc' => SomeOther::class 
]; 

$getVar = $request->get('type'); 

// So all you need do is 
if (array_key_exists($getVar, $types)) { 
    $e = new $types[$getVar](); 
} else { 
    throw new NotFoundHttpException(); 
} 
関連する問題