Laravel应用程序的正确结构以及应该处理响应的位置?

时间:2016-02-15 21:49:37

标签: php laravel laravel-5 laravel-5.1

所以目前我的应用程序的结构使得控制器将访问一个处理器"某些对象的类(业务逻辑)。然后,该处理器对象访问执行操作所需的所有相关存储库(数据访问逻辑)。

例如,让我们假装有一个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.');

    }

}

0 个答案:

没有答案