如果多个$ _GET变量,则缩短if else

时间:2016-03-14 10:46:19

标签: php laravel

我使用Laravel作为API并尝试获取用户可以输入的多个_GET变量。

使用所有过滤器时,代码如下所示:

 public function MUIntervalAPICall(Request $dte)
    {
      $date = $dte->dte;
      $element_language = $dte->language;
      $element_customer = $dte->customer;
      $element_contract = $dte->contract;
      $element_subcontract = $dte->subcontract;
      $element = $dte->element;

      //all filters

      if(isset($_GET['customer']) && isset($_GET['language']) && isset($_GET['contract']) && isset($_GET['subcontract']) && isset($_GET['element']))
      {
        $where = ['dte' => $date, 'element_language' => $element_language, 'element_customer' => $element_customer, 'element_contract' => $element_contract, 'element_subcontract' => $element_subcontract, 'element' => $element];
      }

      $mu_interval = MUInterval::select('element_customer', 'element_contract', 'element_subcontract', 'element_language', 'element_site', 'element', 'src_id', 'src_type_id', 'dte', 'intvl', 'val_src_id', 'exception_name', 'duration_seconds', 'duration_fte')
          ->where($where) 
          ->get()->toArray();
      function array_to_xml( $data, &$xml_data ) {
          foreach( $data as $key => $value ) {
              if( is_array($value) ) {
                  $key = 'Exception';
                  $subnode = $xml_data->addChild($key);
                  array_to_xml($value, $subnode);
              } else {
                  $xml_data->addChild("$key",htmlspecialchars("$value"));
              }
           }
      }
      $xml_data = new SimpleXMLElement('<?xml version="1.0"?><muExceptions></muExceptions>');
      array_to_xml($mu_interval,$xml_data);
      $result = $xml_data->asXML();
      return Response::make($result, '200')->header('Content-Type', 'text/xml');
    }

现在,用户只想使用少量变量来过滤掉它。例如日期和客户,或仅限语言和合同。 我目前正在编写一长串if-else语句来生成结果(真的很长,包括六个$ _GET变量的所有可能性):

elseif(isset($_GET['subcontract']) && isset($_GET['element']))
      {
        $where = ['dte' => $date, 'element' => $element, 'element_subcontract' => $element_subcontract];
      }

对于如此长的if-else语句,是否有更短的方法?

3 个答案:

答案 0 :(得分:1)

是的,您应该了解Laravel验证和表单请求验证的工作原理: https://laravel.com/docs/5.1/validation

https://laravel.com/docs/5.1/validation#form-request-validation

这是一种更短更方便的验证方法。

答案 1 :(得分:0)

写下您的条件如下: -

if(isset($_GET['subcontract'],$_GET['element']) && !isset($_GET['customer'], $_GET['language'], $_GET['contract'])){
   $where = ['dte' => $date, 'element' => $element, 'element_subcontract' => $element_subcontract];
}

elseif(isset($_GET['customer'], $_GET['language'], $_GET['contract'], $_GET['subcontract'],$_GET['element'])){
   $where = ['dte' => $date, 'element_language' => $element_language, 'element_customer' => $element_customer, 'element_contract' => $element_contract, 'element_subcontract' => $element_subcontract, 'element' => $element];
}

建议: - 您应该使用Laravel的Validator类进行验证。

请参阅以下链接。

http://www.sitepoint.com/data-validation-laravel-right-way/

https://laravel.com/docs/5.1/validation

答案 2 :(得分:0)

  1. isset一次接受多个参数:

    if (isset($_GET['customer'], $_GET['language'], $_GET['contract'], ...))
    
  2. 您可以使用数组交集/差异:

    if (!array_key_diff(array_flip(['customer', 'language', ...]), $_GET))
    

    如果array_key_diff返回一个空数组,则所有这些键都存在于$_GET数组中。