在Symfony3 / PHP中通过字符串变量创建新的Object

时间:2017-09-19 13:35:57

标签: php symfony object

我通过ajax帖子将变量发送到我的路线。基于type值的值,我创建了一个新的Object,如下所示:

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

即使switch我认为它仍然“丑陋”,这很快就会失控。我有什么办法吗?像这样:

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

任何暗示赞赏

编辑我使用这个use AppBundle\Entity\HardwareType;等等的类。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

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

如果需要,可以像这样添加路径或类:

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

显然,您需要在文件的开头添加use,如果该类存在,您可以在new之前检查

像这样:

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

答案 1 :(得分: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();
}