所以目前我的应用程序的结构使得控制器将访问一个处理器"某些对象的类(业务逻辑)。然后,该处理器对象访问执行操作所需的所有相关存储库(数据访问逻辑)。
例如,让我们假装有一个UserProcessor类,我们用它来尝试通过某些功能更新用户的电子邮件:updateEmail($ user_id,$ new_email)。然后在电子邮件中处理验证,但是假设此验证失败。显然,updateEmail函数可能会有多个向量失败。其中许多会抛出异常,但在验证和其他一些情况下,它们不会(它们不是完全意外的错误,因此异常是不正确的?)。
我的问题是由于多次失败的可能性而发生的。我不确定如何处理updateEmail的非异常类型失败。我可以让updateEmail根据需要返回一个响应对象来解决所有问题。但是关于这一点感觉不对,是不是应该在Controller中处理响应对象的生成?
我还可以创建一个errors变量,控制器在从updateEmail接收False时访问该变量。但这最终在我的api方面非常通用,它返回" status"," message"和" payload"。在我目前的表单中,我有一个错误的通用消息,例如:"已发生验证错误。"然后在有效负载中列出特定的错误。我可以在我的UserProcessor中创建一个errorMessage变量,但此时我还可以返回一个响应对象,因为我还需要存储HTTP错误代码?
我是否过度思考这个?处理器应该只处理响应吗?
编辑:
class UserProcessor {
private $user;
private $error_code;
private $error_message;
private $error_payload;
public function __construct(UserRepositoryContract $user){
$this->user = $user;
}
public function error(){
return array(
'code' => $this->error_code,
'message' => $this->error_message,
'payload' => $this->error_payload
);
}
public function updateEmail($user_id, $new_email, $confirmation_email){
$validator = $this->validateEmail(array(
'email' => $new_email,
'email_confirmation' => $confirmation_email
));
if( $validator->fails() ){
$this->error_code = 400;
$this->error_message = 'validation error(s) have occurred.';
$this->error_payload = $validator->errors();
return False;
}
$confirmation_code = str_random(30);
$returned = $this->user->update($user_id, array(
'email' => $new_email,
'confirmed' => 0,
'confirmation_code' => $confirmation_code
));
if( !$returned ){
$this->error_code = 500;
$this->error_message = 'an internal error occurred while ';
$this->error_message .= 'attempting to update user record.';
return False;
}
$this->sendConfirmationCodeEmail($user_id);
return True;
}
}
class UserController extends Controller{
private $user;
private $processor;
public function __construct(UserRepositoryContract $user, UserProcessor $processor){
$this->middleware('auth.api', [ 'except' => ['verifyEmail', 'updateEmail', 'changeName', 'changePassword', 'deleteAccount'] ]);
$this->user = $user;
$this->processor = $processor;
}
public function updateEmail(Request $request, $user_id){
$response = $this->processor->updateEmail($user_id, $request->email, $request->email_confirmation);
if( !$response ){
$error = $this->processor->error();
return $this->responseBuilder(
'fail',
$error['code'],
$error['message'],
$errors['payload']
);
}
return $this->responseBuilder('success', 200, 'successfully updated user\'s email.');
}
}