if else api结构的设计模式


Design pattern for if else api structure

我有一个中心点,请求进来与GET var '服务','动作',也许一些POST数据。

这是我的api.php现在的样子:
<?php
$service_name = filter_input(INPUT_GET, 'service');
if($service_name == 'training') {
    require_once('../service/TrainingService.php');
    $service = new RegisterService();
}
elseif ($service_name == 'mail') {
    require_once('../service/MailService.php.php');
    $service = new MailService();
}
$service->init();

有没有更干净的方法?也许是一个奇特的设计模式?我可以想象这个if else结构会变得很大。

更新:

我喜欢Marc B的解决方案。这是我的版本。提出更好方法的想法总是受欢迎的。也许从XML配置文件加载可用的类?

<?php
$services = array(
    'mail' => 'MailService.php',
    'training' => 'TrainingService.php'
);
$service_object = null;
$service_name = filter_input(INPUT_GET, 'service');
if (array_key_exists($service_name, $services)) {
    require_once('../service/' . $services[$service_name]);
    $class_name = ucfirst($service_name) . 'Service';
    $service_object = new $class_name();
    if($service_object != null && is_subclass_of($service_object, 'Service')) {
        $service_object->init();
    }
}
?>

使用查找数组?

$services = array
  // 'name' => 'script file'
  'mail' => 'MailService.php',
  'training' => 'TrainingService.php'
);
if (array_key_exists($service_name, $services)) {
    require_once('../service/' . $services[$service_name]);
}

尝试使用像Flight这样的框架。Flight(和其他)有能力为您定义路线。用你的例子:

Flight::route('POST /training', function(){
    ... code for POST to /training.
});
Flight::route ('/mail', function(){
    ... do something with either GET, POST, etc.
}
Flight::start();