你知道什么是 AOP 吗?

前言

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等。

推荐阅读


新亮笔记
技术的深度和广度只能靠自己努力去发掘,谁也不能替你学习,在这里希望你能有所收获。

日拱一卒

2.9k 声望
1.2k 粉丝
0 条评论
推荐阅读
关于项目中 Repository 层的思考
维护这一层的开发者,可以称为 仓库管理员 ,当使用者需要查询数据的时候,需要告诉仓库管理员,由仓库管理员拿给他,至于仓库管理员从哪拿的数据,使用者无需关系。

新亮2阅读 1.8k评论 1

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.7k评论 4

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go6阅读 2.9k评论 4

封面图
图片防盗链破解 解决图片防盗链问题 反向代理
当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。

TANKING7阅读 11.7k评论 5

Hyperf 3.0 发布,PHP 新时代
在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。

huangzhhui4阅读 1.5k评论 1

封面图
微信公众号开发:自动回复文本/图片/图文消息/关键词回复/上传素材/自定义菜单
对接流程1、申请微信公众号测试账号URL:[链接]2、登录,配置开发者服务器URL和Token开发者服务器配置代码:config.php {代码...} URL是config.php在你服务器的URLToken是上面代码自己设置的Token搞定之后,就能完...

TANKING2阅读 10.6k

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go3阅读 789评论 2

封面图

日拱一卒

2.9k 声望
1.2k 粉丝
宣传栏