Laravel5 利用中间件修改请求参数

用得越多 Laravel 做开发,就会发现它越强大! 开发者可以非常灵活的解决各种实际开发中碰到的问题。

废话不多说,开始本文的正题:

首先说说我碰到的问题:以前开发过一个功能,用了个插件,规定某个请求当中需要带参数 auth_token,
比如 http://localhost/index.php?auth_token=xxx

一直用着相安无事,但是最近要重构这个项目,改用了另一个插件,但是这个插件规定必须使用参数 token,比如 http://localhost/index.php?token=xxx

按道理来讲,我在 controller 里面改这个参数也是可以的,但是问题就来了,这两个插件访问前都必须经过授权中间件,不然就访问不了。进不去 controller,所以考虑其他方法来解决了。

后来想了想,去官方看了关于中间件的资料:《Route Groups》和《HTTP Middleware》,里面提到了:

To assign middleware to all routes within a group, you may use the middleware key in the group attribute array. Middleware will be executed in the order you define this array:

红字部分是重点,翻译:中间件将会按照数组中定义的顺序依次执行。 那么思路就清晰了,我自己定义一个中间件放在授权中间件之前,然后在这个中间件里面改变参数即可!

新建中间件

进入终端输入

1
php artisan make:middleware PreAuth

然后在 app/Http/Middleware 目录下找到 PreAuth.php,并编辑为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

namespace App\Http\Middleware;

use Closure;

class PreAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// 替换参数,并销毁原参数
$request->offsetSet('token', $request->input('auth_token'));
$request->offsetUnset('auth_token');

return $next($request);
}
}

Kernel.php 中增加中间件配置

编辑文件 app/Http/Kernel.php,在 $routeMiddleware 数组中添加刚刚的中间件:

1
2
3
4
protected $routeMiddleware = [
// ...
'pre.auth' => \App\Http\Middleware\PreAuth::class,
];

路由中增加中间件配置

1
2
3
Route::group(['middleware' => ['pre.auth', 'auth']], function() {
Route::controller("home", "HomeController");
});

大功告成。