Skip to content

Handler业务处理入口

simon edited this page Jun 19, 2019 · 5 revisions

简介

Handler处理器的出现是为了解决部分情况业务逻辑冗余以及Controller或其它主处理中不可分离的业务逻辑。 我们采用Handler+Task来分离原有架构中的Service层 Handler就是核心业务逻辑的处理

说明

Handler是承载所有业务逻辑的入口。 虽然是承载重业务但并不表示Handler是冗余的,一个Handler仍然只是处处理一个用例,即:一个独立的功能

调用与被调用

  • 每个Handler只处理一个用例
  • 一定不可调用Request。我们提供了数据供给器(DataProvider)来传递给Handler需要处理的参数
  • 可以调用Task(分片共用的业务逻辑),Repository,Model
  • 只能被高层调用,如Controller,Command,Job,Listener,Event
  • 不允许继承,公用的应该调用Task

示例

/**
 * Class CodeHandler
 * @package CrCms\Passport\Handlers
 */
class CodeHandler extends AbstractHandler
{
    /**
     * @param DataProviderContract $provider
     * @return string
     */
    public function handle(DataProviderContract $provider): string
    {
        $object = $provider->get('object');
        $type = $provider->get('type');
        try {
            $user = $this->app->make(UserRepository::class)->byMobileOrEmailOrFail($object);
        } catch (ResourceNotFoundException $exception) {
            throw ValidationException::withMessages(['user' => $exception->getMessage()]);
        }

        $code = $this->app->make(CodeService::class)->generate([$object]);

        (new SendCodeTask)->handle($object, $user, $code, $type);

        return $code;
    }
}
Clone this wiki locally