Skip to content

Commit be0ecde

Browse files
committed
docs: Laravel中间件,管道之面向切面编程.md
1 parent c20195a commit be0ecde

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
## Laravel 中间件,管道之面向切面编程
2+
3+
## Laravel 中间件是什么
4+
5+
Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。例如,Laravel 内置了一个中间件来验证用户的身份认证。如果用户没有通过身份认证,中间件会将用户重定向到登录界面。但是,如果用户被认证,中间件将允许该请求进一步进入该应用。
6+
7+
当然,除了身份认证以外,还可以编写另外的中间件来执行各种任务。例如:CORS 中间件可以负责为所有离开应用的响应添加合适的头部信息;日志中间件可以记录所有传入应用的请求。
8+
9+
Laravel 自带了一些中间件,包括身份验证、CSRF 保护等。所有这些中间件都位于 app/Http/Middleware 目录。
10+
11+
简单来说就是请求在不去修改自身的逻辑,通过中间件扩展或者处理一些功能。
12+
13+
14+
## 那和面向切面编程有什么关系呢?
15+
16+
在我理解 Laravel 中间件和切面编程就是一个意思,就是都需要经过一些步骤,不去修改自己的代码,以此来扩展或者处理一些功能。举个生活中的例子电影院验票。验票员就是所谓的中间件,每个买票的同学都需要经过他的验证才能进入影院看电影。
17+
18+
19+
## 一个程序该如何实现中间件呢?
20+
21+
我们也采用面向接口编程的形式,来定义我们的中间件
22+
23+
```php
24+
25+
interface Milldeware {
26+
public static function handle(Closure $next);
27+
}
28+
29+
class VerfiyCsrfToekn implements Milldeware {
30+
31+
public static function handle(Closure $next)
32+
{
33+
echo '验证csrf Token <br>';
34+
$next();
35+
}
36+
}
37+
38+
class VerfiyAuth implements Milldeware {
39+
40+
public static function handle(Closure $next)
41+
{
42+
echo '验证是否登录 <br>';
43+
$next();
44+
}
45+
}
46+
47+
class SetCookie implements Milldeware {
48+
public static function handle(Closure $next)
49+
{
50+
$next();
51+
echo '设置cookie信息!';
52+
}
53+
}
54+
55+
$handle = function() {
56+
echo '当前要执行的程序!';
57+
}
58+
59+
function call_middware() {
60+
SetCookie::handle(function (){
61+
VerfiyAuth::handle(function() {
62+
VerfiyCsrfToekn::handle($handle);
63+
});
64+
});
65+
}
66+
67+
call_middware();
68+
69+
```
70+
71+
下面我们来说一下 call_middware 都做了什么事
72+
73+
1. 第一步执行 call_middware 函数 会执行 SetCookie::handle。
74+
2. 当执行 SetCookie::handle 的时候会发现要先执行 $next(); 再 echo '设置cookie信息!';
75+
3. 所以就先执行了 VerfiyAuth::handle,这时候会先执行 echo '验证是否登录 <br>';然后执行 $next();
76+
4. 执行 VerfiyCsrfToekn::handle 这时候会先执行 echo '验证csrf Token <br>';然后执行 $next();
77+
5. 执行 $handle();
78+
6. 最后 在 echo '设置cookie信息!'。
79+
80+
明白了其中原理,有些同学想这样代码肯定不会很好维护和扩展啊。那我们应该怎么去修改我们的代码呢?
81+
82+
首先,希望同学能先知道两个函数的使用
83+
84+
1.call_user_func();
85+
86+
2.array_reduce();
87+
88+
具体两个函数的作用请先查看 php 文档。
89+
90+
```php
91+
92+
interface Milldeware {
93+
public static function handle(Closure $next);
94+
}
95+
96+
class VerfiyCsrfToekn implements Milldeware {
97+
98+
public static function handle(Closure $next)
99+
{
100+
echo '验证csrf Token <br>';
101+
$next();
102+
}
103+
}
104+
105+
class VerfiyAuth implements Milldeware {
106+
107+
public static function handle(Closure $next)
108+
{
109+
echo '验证是否登录 <br>';
110+
$next();
111+
}
112+
}
113+
114+
class SetCookie implements Milldeware {
115+
public static function handle(Closure $next)
116+
{
117+
$next();
118+
echo '设置cookie信息!';
119+
}
120+
}
121+
122+
$handle = function() {
123+
echo '当前要执行的程序!';
124+
};
125+
126+
$pipe_arr = [
127+
'VerfiyCsrfToekn',
128+
'VerfiyAuth',
129+
'SetCookie',
130+
];
131+
132+
$callback = array_reduce($pipe_arr,function($stack,$pipe) {
133+
return function() use($stack,$pipe){
134+
return $pipe::handle($stack);
135+
};
136+
},$handle);
137+
138+
call_user_func($callback);
139+
140+
141+
```
142+
143+
最后的实现就是这样子的。当然 laravel 中实现 middware 也是主要通过call_user_func 和 array_reduce() 实现的
144+
145+
146+
[示例代码下载链接](https://github.com/cxp1539/laravel-core-learn/blob/master/code/Class5.php)

0 commit comments

Comments
 (0)