我有一个中心点,请求进来与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();