前言

AOP 的全称为 Aspect Oriented Programming,意思是:面向切面编程。

为什么会有这篇文章?是因为看了 Laravel 中 Pipeline 的设计,发现 Pipeline 就是基于 AOP 思维的一种实现。

说起 AOP,就不得不说起 OOP,它们又是什么关系,有什么区别?

AOP 与 OOP 的区别

OOP 咱们都晓得,全程为 Object Oriented Programming ,意思是:面向对象编程。

首先咱们要晓得 AOPOOP 不是互相对抗的关系,能够把 AOP 看作是补救 OOP 的有余,以此之长、补彼之短,两者联合应用成果最佳。

OOP 是针对业务 实体 及其 属性行为 进行 形象封装 ,这个不难理解,例如:用户模块、订单模块 等。

AOP 是针对业务切面进行提取,它所面对的是处理过程中的某个 步骤阶段 ,以达到逻辑处理过程中各局部之间低耦合性的 隔离成果 ,例如:日志记录、权限验证 等。

举个例子就容易了解了,如果单纯应用 OOP ,须要在日志模块、订单模块中进行权限验证、日志记录怎么办?难道要在每个办法前都退出权限验证、日志记录的代码吗?那么如果须要在每个办法前和办法后都记录日志怎么办?

这时如果应用 AOP,就能够借助代理实现这些反复的操作,就能够不在每个办法前退出权限验证、日志记录的代码,升高各局部之间的耦合。

AOP 能做什么

除了下面说的 权限验证、日志记录,AOP 还能够做 数据加解密、申请响应数据标准 ...

只有是和具体的业务无关的,同时又是业务都在关注的,那么都能够通过 AOP 去抽离这些关注点并将其对立保护,进步代码的复用性。

下面的业务关注点是不是有点似曾相识... 其实咱们罕用的 路由中间件 就是基于 AOP 思维的一种实现。

AOP 的一种实现

举例:Laravel 中的 路由中间件

/** * Send the given request through the middleware / router. * * @param  \Illuminate\Http\Request  $request * @return \Illuminate\Http\Response */protected function sendRequestThroughRouter($request){    $this->app->instance('request', $request);    Facade::clearResolvedInstance('request');    $this->bootstrap();    return (new Pipeline($this->app))                ->send($request)                ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)                ->then($this->dispatchToRouter());}

通过上述代码,能够发现须要执行的中间件配置在 through() 办法中,执行后再执行 then 办法。

上述代码用在了 路由中间件 中,当然也能够用在其余中央,比方用到 controller 中,就能够这样写:

// 示例代码$pipes = [    LoggingPipeline::class,   // 日志记录    PermitPipeline::class,    // 权限验证];return app(Pipeline::class)    ->send($request->all())    ->through($pipes)    ->then(function ($content) {        return $content;    });

下面只是在 Laravel 中的一种实现,当然在 PHP 的其余框架中也有相似的实现,例如:YiiThinkPHP 等。

AOP 只是个思维,当然也有其余语言实现,例如:GolangJava等。

举荐浏览

  • 编程是一种思维,而不是敲代码
  • 做业务零碎研发如何做到认真负责?