0

配列内のすべてのサブスクリプションに電子メールを送信するループが与えられた場合

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

    }
}

すべてのモデルが正常にメール送信された場合にコールバックをトリガーする、またはモデルの 1 つがメール送信に失敗した場合にエラーを表示する最もクリーンな方法は何でしょうか。ループの最後まですべてのエラー メッセージを保存して全体として出力するか、エラーでループを中断するのが一般的ですか。

これをプロジェクト (/projects/1) を保存する JSON REST API と組み合わせて使用​​し、すべてのユーザーにメールを送信します。

私が現在使用している方法は、ネストされた多数の 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
}

これに関してどんな慣習があるのだろうと思っていました

4

2 に答える 2

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
    }

}
于 2012-08-09T10:43:37.913 に答える
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;
}
于 2012-08-09T08:58:33.483 に答える