if else api结构的设计模式

时间:2015-08-31 19:15:29

标签: php

我有一个中心点,请求来自GET var' service'和' action'也许是一些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他的解决方案。这是我的版本。总是欢迎使用Idea以获得更好的方法...也许从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();
    }
}

?>

2 个答案:

答案 0 :(得分:2)

使用查找数组?

$services = array
  // 'name' => 'script file'
  'mail' => 'MailService.php',
  'training' => 'TrainingService.php'
);

if (array_key_exists($service_name, $services)) {
    require_once('../service/' . $services[$service_name]);
}

答案 1 :(得分:0)

尝试使用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();