Php Laravel应用程序的适当结构以及应在何处处理响应?

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函数可能会因多个向量而失败。其中许多将抛出异常,但在验证和其他一些情况下,它们不会抛出异常(它们不是完

因此,目前我的应用程序的结构是,控制器将访问特定对象的“处理器”类(业务逻辑)。然后,此处理器对象访问执行操作所需的所有相关存储库(数据访问逻辑)

例如,让我们假设有一个UserProcessor类,我们正在使用它来尝试通过一些函数更新用户的电子邮件:updateEmail($user\u id,$new\u email)。然后在电子邮件中处理验证,但假设此验证失败。显然,updateEmail函数可能会因多个向量而失败。其中许多将抛出异常,但在验证和其他一些情况下,它们不会抛出异常(它们不是完全意外的错误,因此异常是不正确的?)

我的问题出现是因为可能会出现多个故障。我不确定如何处理UpdateMail的非异常类型失败。我可以让UpdateMail根据需要返回一个response对象来解决所有问题。但是关于这一点有些不对劲,响应对象的生成不是应该在控制器中处理吗

我还可以创建一个errors变量,控制器在从updateEmail接收False时访问该变量。但就我的api而言,这是非常通用的,它返回“status”、“message”和“payload”。在我当前的表单中,我有一条关于错误的通用消息,比如:“发生了验证错误。”然后在有效负载中列出了特定的错误。我可以在我的UserProcessor中创建一个errorMessage变量,但在这一点上,我还可以返回一个响应对象,因为我还需要存储HTTP错误代码

我是不是想得太多了?处理器应该只处理响应吗

编辑:


你的问题在某些方面有点复杂和宽泛。您应该在问题中包含代码,以展示您试图描述的示例。这将为您当前的实现提供一些上下文和视角,因为这一点被冗长的解释抽象了一点。@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.');

    }

}