用条件重构循环

时间:2012-08-09 08:49:56

标签: php

给定一个循环,向数组中的所有订阅发送电子邮件

foreach($subscriptions as $s){
    if(!$s->send_email()){

    }
}

如果所有模型已成功邮寄或在其中一个模型未能邮寄时显示错误,那么触发回调的最简洁方法是什么?保存所有错误消息直到循环结束并将它们作为一个整体打印,或者通过错误打破循环是常见的。

我将此项与JSON REST API结合使用,保存项目(/ projects / 1),然后通过电子邮件向所有用户发送电子邮件。

我正在使用的方法现在感觉脏了很多嵌套if else,在不同的地方发送3个不同的响应

if($project->save()){
    $subscriptions = Subscription::model()->findAllByAttributes(array('planning_id' => $planning->id));
    foreach($subscriptions as $s){
        if(!$s->send_email()){
            $errors[] = "failed to send email. Subscription ". $s->id;
        }
     }
     if(count($errors) > 0){
          //send json api response with error response
     } else {
         //send json api success response
    }
} else {
    //send json api response with project error response
}

我想知道关于这个

的约定

2 个答案:

答案 0 :(得分:1)

它有点混乱 - 它结合了“保存”功能中的多个问题 - 阅读代码的任何人都需要了解“保存”的含义,我们如何遍历联系人等。

我会按如下方式重构:

if($project->save()){
    $subscriptions = Subscription::model()->findAllByAttributes(array('planning_id' => $planning->id));
     $errors = sendMailToSubscribers($subscriptions);

     $response = determineResponse($errors);
     // send JSON API response

} else {
    //send json api response with project error response
}

function sendMailToSubscribers($subscriptions){
  foreach($subscriptions as $s){
        if(!$s->send_email()){
            $errors[] = "failed to send email. Subscription ". $s->id;
        }
     }
   return $errors;
  }
function determineResponse($errors){
        if(count($errors) > 0){
          //return json api response with error response
     } else {
         //return json api success response
    }

}

答案 1 :(得分:0)

您可以使用while逻辑,以便故障落到块的末尾。

while(1) {
  if ($project->save()) {
    foreach($subscripts as $s)
      if (!$s->send_email())
        $errors[] = "failed to send email. Subscription ". $s->id;
  } else
    $errors[] = 'failed to save the project';

  if (empty($errors)) {
    //send success here
    break;
  }

  //send your errors here
  break;
}