管理$ _GET和url字符串的最佳实践

时间:2013-06-16 19:20:21

标签: php

在我的应用程序中,某些查询字符串将执行某些类方法,我目前正在使用一堆switch语句来实现这一点。例如:

switch (true) {
   case isset($_GET['action']):
       switch($_GET['action']) {
           case 'delete':
               if ($obj->delete($x)) {
                   // do something
               } else {
                  // do something
               }
           break;
           case 'update':
               if ($obj->update($x)) {
                   // do something
               } else {
                  // do something
               }
           break;
           case 'edit':
               if ($obj->edit($x)) {
                   // do something
               } else {
                  // do something
               }
           break;
       }
   break;
   and so forth.....................
}

上面是一个调低的例子,在某些情况下还有其他的switch语句。我发现使用这种方法比一堆if语句更清晰 - 但我真正想要的是处理这些调用的一种更有效的方法,因为现在开始变得难以维护。

我在做什么不好的做法?

我是否可以为此阅读建议的模式?

2 个答案:

答案 0 :(得分:0)

如果这真的是你的代码,那么:

$x = '???';
if(isset($_GET['action'])){
  $action = $_GET['action'];

  if(method_exists($obj, $action) && $obj->{$action}($x)){
     // printf('%s done!', $action);
  }
}

答案 1 :(得分:0)

这是不好的做法。当你的switch失控时,你做错了!

OTP 的想法很好,但我会稍微改变一下。

如果它太大,我会将整个处理部分转换为一个类。 请参阅下面的概念验证。一个名为action的方法的类更多维持得比switches from hell

/**
* Handles the actions.
*/
class GetHandler {
    /**
    * Place errors here from the handling method.
    */
    public $Errors = array();

    public function __construct(){
        // setup the $obj here and stuff
    }

    public function update(){
        // do stuff
    }

    public function edit(){
        // do stuff
    }

    public function delete(){
        // do stuff
    }

    public function __invoke(){
        // no handler handling here
        $this->Errors[] = 'Invalid action performed.';
    }
} // class GetHandler;

// Expose the GetHandle in globals if this code is not in global scope
$GLOBALS['GetHandler'] = $GetHandler = new GetHandler();

// Now forward the action to the handler
if(!empty($_GET['action']) and is_string($_GET['action'])){
    // Now check if the method exists
    if(method_exists($GetHandler, $_GET['action'])){
        call_user_func(array($GetHandler, $_GET['action']));
    }else{
        // invoke the object and let it handle errors
        call_user_func($GetHandler);
    }
}else{
    // invoke the object and let it handle errors
    call_user_func($GetHandler);
}

// Later on, anywhere... you can do error checking
if(!empty($GLOBALS['GetHandler']->Errors)){
    foreach($GLOBALS['GetHandler']->Errors as $Error){
        echo $Error, PHP_EOL;
    }
}else{
    // handle a success
    // use $GLOBALS['GetHandler'] custom properties to get success data
}

仍然,IMO,巨大的交换机并不好。