给定一个循环,向数组中的所有订阅发送电子邮件
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
}
我想知道关于这个
的约定答案 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;
}