【问题标题】:Avoid large switch statement in frontcontroller避免在前端控制器中使用大的 switch 语句
【发布时间】:2012-01-28 16:24:36
【问题描述】:

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

开关太大了,太丑了。我正在考虑创建一个数组并简单地做:

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

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

谢谢!

【问题讨论】:

标签: php oop switch-statement front-controller


【解决方案1】:

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

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/ 用于存储所有控制器。例如

控制器/test1.php

<?php

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

访问index.php?request=test1时,会调用Test1-&gt;index(),从而输出

测试 1

【讨论】:

  • 我完全赞成这样做,但我没有这样做的原因是:pooteeweet.org/blog/538,我不知道这对今天有多真实,但不是这样吗?使用 __autoload 你基本上对 apc 和类似的操作码缓存不走运?
  • @neph 不,APC 可以正常工作。见stackoverflow.com/a/1396538/453331
  • __autoload() 是“一种”已弃用。你应该使用spl_autoload_register(),它的工作原理非常相似并且(最后)完全一样。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多