避免在前控制器中使用大的switch语句

时间:2012-01-28 16:24:37

标签: php oop switch-statement front-controller

我有一个更大的应用程序,在php中使用Frontcontroller来处理传入的ajax请求。我正在考虑一种处理Action->方法映射的好方法,这个控制器负责实例化其他类并在那里执行方法。

开关变得太大而且很难看。我正在考虑创建一个数组并简单地执行:

if(in_array($action, $methodmap)){
  $methodmap[$action]();
}    

但不确定效率如何,或者是否还有其他更好的选择,性能很重要,因为这个控制器会处理大量的传入请求。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以创建一个简单的路由系统。

的index.php

<?php

class InvalidClassException extends Exception {}
function autoloader($class)
{
    $path = 'controllers/'.$class.'.php';
    if (!ctype_alnum($class) || !file_exists($path))
        throw new InvalidClassException("Couldn't find '$class'");
    require($path);
}
spl_autoload_register('autoloader');

$request = isset($_GET['request'])?$_GET['request']:'front';
$controller = new $request();
$controller->index();

存储所有控制器的目录controllers/。 E.g。

控制器/ test1.php

<?php

class Test1
{
    public function index()
    {
        print "Test 1";
    }
}

访问index.php?request=test1时,将调用Test1->index(),因此输出

  

测试1

答案 1 :(得分:0)

尝试使用“路由”配置文件...这样,您可以向应用程序添加新路由,而无需更改实际操作/方法映射代码