使用switch语句处理请求的替代方法

时间:2016-08-03 07:18:08

标签: php http cron httprequest

我必须设置多个cron作业。每个cron都是对服务器的单独请求。所以,我从以下开始,每个请求将由交换机内的一个案例处理,但案例必然会增加,因此在我看来并不是一个好主意。

require_once './invoice_cron.php';

$checkRequest = isset($_REQUEST['request']);

if($checkRequest) {
    $request_name = $_REQUEST['request'];
    switch($request_name) {
        case 'send_invoice':
            break;
        default:
            break;
    }
}

这里有什么更好的方法?

2 个答案:

答案 0 :(得分:0)

    每个请求类型的
  • 必须与函数匹配
  • 在开始处理之前,必须在系统中定义所有类型的请求
  • 如果请求不在列表中=>必须发生一些合乎逻辑的反应

我会给你一个简单的例子,你可以开发它

class Request{

    private $REQUEST_TYPES = ['get_invoice', 'set_invoice', 'print_invoice'];

    public function handler($requestKey){
        foreach($this->REQUEST_TYPES as $type){
            if($requestKey == $type) $this->$type();
        }
        $this->handlerNotFound();
    }

    private function get_invoice(){
        //do some thing here
    }

    private function set_invoice(){
        //do some thing here
    }

    private function print_invoice(){
        //do some thing here
    }

    private function handlerNotFound(){
        //do some thing here
    }
}

答案 1 :(得分:0)

请有一个请求处理程序接口:

<?php
  // CronRequests.php

  require_once __DIR__.'./autoload.php';

  $request_name = isset($_REQUEST['request']) ? 
                   (new _cron)->handler($_REQUEST['request']) : 
                   null ;

创建一个可以处理每个请求的类:

class _cron {

/**
 * List of possible requests
 * @var array
 */
 private static $REQUESTS = ['send_invoice','start_user_subscription'];

/**
 * HTTP request handler for all cron jobs
 * @param string $request_name Name of the request
*/
 public function handler($request_name) {
    $status = false;
    if(isset($request_name)) {
        $request_map = array_flip(self::$REQUESTS);
        if(isset($request_map[$request_name])) {
            $status = $this->$request_name();
        }
    }
    return $status;
 }
} 

请求列表必然会增加,因此有必要有效地搜索列表。所以,在这里我们进行数组翻转并检查存在的关键。