php 面向切面编程,Laravel 中间件、管道之面向切面编程

本文介绍了Laravel中间件的概念及其实现方式,解释了中间件如何作为面向切面编程的一种形式,用于处理HTTP请求,扩展应用程序的功能而不改变其核心逻辑。

Laravel 中间件、管道之面向切面编程

由 cxp1539 创建于2年前, 最后更新于 2年前

版本号 #1

4859 views

5 likes

0 collects

Laravel中间件是什么

Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。例如,Laravel 内置了一个中间件来验证用户的身份认证。如果用户没有通过身份认证,中间件会将用户重定向到登录界面。但是,如果用户被认证,中间件将允许该请求进一步进入该应用。

当然,除了身份认证以外,还可以编写另外的中间件来执行各种任务。例如:CORS 中间件可以负责为所有离开应用的响应添加合适的头部信息;日志中间件可以记录所有传入应用的请求。

Laravel 自带了一些中间件,包括身份验证、CSRF 保护等。所有这些中间件都位于 app/Http/Middleware 目录。

简单来说就是请求在不去修改自身的逻辑,通过中间件扩展或者处理一些功能。

和面向切面编程的关系

在我理解Laravel中间件和切面编程就是一个意思,就是都需要经过经过的一些步骤,不去修改自己的代码,以此来扩展或者处理一些功能。举个生活中的例子电影院验票。验票员就是所谓的中间件,每个买票的同学都需要经过他的验证才能进入影院看电影。

如何实现中间件

我们也采用面向接口编程的形式,来定义我们的中间件:

interface Milldeware {

public static function handle(Closure $next);

}

class VerfiyCsrfToekn implements Milldeware {

public static function handle(Closure $next)

{

echo '验证csrf Token
';

$next();

}

}

class VerfiyAuth implements Milldeware {

public static function handle(Closure $next)

{

echo '验证是否登录
';

$next();

}

}

class SetCookie implements Milldeware {

public static function handle(Closure $next)

{

$next();

echo '设置cookie信息!';

}

}

$handle = function() {

echo '当前要执行的程序!';

}

function call_middware() {

SetCookie::handle(function (){

VerfiyAuth::handle(function() {

VerfiyCsrfToekn::handle($handle);

});

});

}

call_middware();

下面我们来说一下call_middware都做了什么事

第一步执行call_middware 函数 会执行 SetCookie::handle。

当执行SetCookie::handle的时候会发现要先执行$next();在echo '设置cookie信息!';

所以就先执行了VerfiyAuth::handle,这时候会先执行echo '验证是否登录
';然后执行 $next();

执行 VerfiyCsrfToekn::handle 这时候会先执行echo '验证csrf Token
';然后执行 $next();

执行 $handle();

最后 在echo '设置cookie信息!'。

明白了其中原理,有些同学想这样代码肯定不会很好维护和扩展啊。那我们应该怎么去修改我们的代码呢?

首先,希望同学能先知道两个函数的使用

1.call_user_func();

2.array_reduce();

具体两个函数的作用请先查看php文档。

interface Milldeware {

public static function handle(Closure $next);

}

class VerfiyCsrfToekn implements Milldeware {

public static function handle(Closure $next)

{

echo '验证csrf Token
';

$next();

}

}

class VerfiyAuth implements Milldeware {

public static function handle(Closure $next)

{

echo '验证是否登录
';

$next();

}

}

class SetCookie implements Milldeware {

public static function handle(Closure $next)

{

$next();

echo '设置cookie信息!';

}

}

$handle = function() {

echo '当前要执行的程序!';

};

$pipe_arr = [

'VerfiyCsrfToekn',

'VerfiyAuth',

'SetCookie',

];

$callback = array_reduce($pipe_arr,function($stack,$pipe) {

return function() use($stack,$pipe){

return $pipe::handle($stack);

};

},$handle);

call_user_func($callback);

最后的实现就是这样子的。当然laravel中实现middware也是主要通过call_user_func和array_reduce() 实现的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值