Php Laravel应用程序的适当结构以及应在何处处理响应?
因此,目前我的应用程序的结构是,控制器将访问特定对象的“处理器”类(业务逻辑)。然后,此处理器对象访问执行操作所需的所有相关存储库(数据访问逻辑) 例如,让我们假设有一个UserProcessor类,我们正在使用它来尝试通过一些函数更新用户的电子邮件:updateEmail($user\u id,$new\u email)。然后在电子邮件中处理验证,但假设此验证失败。显然,updateEmail函数可能会因多个向量而失败。其中许多将抛出异常,但在验证和其他一些情况下,它们不会抛出异常(它们不是完全意外的错误,因此异常是不正确的?) 我的问题出现是因为可能会出现多个故障。我不确定如何处理UpdateMail的非异常类型失败。我可以让UpdateMail根据需要返回一个response对象来解决所有问题。但是关于这一点有些不对劲,响应对象的生成不是应该在控制器中处理吗 我还可以创建一个errors变量,控制器在从updateEmail接收False时访问该变量。但就我的api而言,这是非常通用的,它返回“status”、“message”和“payload”。在我当前的表单中,我有一条关于错误的通用消息,比如:“发生了验证错误。”然后在有效负载中列出了特定的错误。我可以在我的UserProcessor中创建一个errorMessage变量,但在这一点上,我还可以返回一个响应对象,因为我还需要存储HTTP错误代码 我是不是想得太多了?处理器应该只处理响应吗 编辑:Php Laravel应用程序的适当结构以及应在何处处理响应?,php,laravel,laravel-5,laravel-5.1,Php,Laravel,Laravel 5,Laravel 5.1,因此,目前我的应用程序的结构是,控制器将访问特定对象的“处理器”类(业务逻辑)。然后,此处理器对象访问执行操作所需的所有相关存储库(数据访问逻辑) 例如,让我们假设有一个UserProcessor类,我们正在使用它来尝试通过一些函数更新用户的电子邮件:updateEmail($user\u id,$new\u email)。然后在电子邮件中处理验证,但假设此验证失败。显然,updateEmail函数可能会因多个向量而失败。其中许多将抛出异常,但在验证和其他一些情况下,它们不会抛出异常(它们不是完
你的问题在某些方面有点复杂和宽泛。您应该在问题中包含代码,以展示您试图描述的示例。这将为您当前的实现提供一些上下文和视角,因为这一点被冗长的解释抽象了一点。@Bogdan很抱歉响应时间太长。我已经在上面的帖子中添加了相关代码。我目前所做的只是在处理器上使用error()函数,但这感觉有些笨拙和错误。处理这个问题的一种方法是让
域模型
返回一个DTO
,其中包含验证结果。控制器可以检查该控制器。然后它就可以决定怎么处理它了?嘿@RyanVincent谢谢你的回复。我要看一看你发布的链接。它们的好处是它们积累了状态
,因此你不必重新检查。此外,它还可以直接传递到视图
,而无需控制器关心视图
想要什么?域为请求的选项填写数据
,视图获取数据并知道如何显示它。控制器根据状态决定路由到何处?假设一个显示字段被添加到数据库表中。控制器没有改变。只有域模型和视图。
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.');
}
}