Laravel学习日记3:路由中间件

Laravel框架里的中间件到底起一种什么作用?在我看来,最主要的功能就是一个框架防火墙的作用:在请求进入到框架内部实际逻辑之前,先对请求做一次或多次检测过滤,如果请求满足了过滤的条件,才会被允许进入到内部实际逻辑。

Laravel中间件可以通过两种方式来创建,一种方式是通过框架自带的“artisan”辅助指令,另一种方式是自己来创建一个新文件,相对而言,使用“artisan”来创建更加便捷与可靠一些。

通过artisan创建一个名为CheckAge的中间件

[root@vm Middleware]# ls
EncryptCookies.php  RedirectIfAuthenticated.php  TrimStrings.php  TrustProxies.php  VerifyCsrfToken.php
[root@vm Middleware]# /usr/local/bin/php /var/www/blog/artisan make:middleware CheckAge
Middleware created successfully.
[root@vm Middleware]# ls
CheckAge.php  EncryptCookies.php  RedirectIfAuthenticated.php  TrimStrings.php  TrustProxies.php  VerifyCsrfToken.php

通过执行php artisan make:middleware CheckAge,就可以在app/Http/Middleware/下自动创建一个名为CheckAge.php的中间件文件了。

可以看一下通过artisan创建的中间件文件的内容:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

这个就是通过artisan创建出的CheckAge.php文件的原始内容了。

相对于自己手动创建的文件,通过artisan辅助指令来创建的文件,最基本的命名空间、引用和文件内容等都已经自动完成了,节省了很多时间,也更加可靠一些,毕竟程序不会出现输入错误这种情况,我们可以在这个基本的文件内容中添加需要的逻辑处理。

handle方法中的$request表示的是http请求,而Closure $next则表示继续执行请求的下一步操作。所以这个handle方法实现的功能就是“继续执行请求的下一步操作”,这是因为此handle方法中没有相关处理逻辑的原因,所以直接返回了继续下一步操作的指令。

我们在handle方法中添加一个处理逻辑:请求参数中的age参数必须大于100,才可以继续下一步请求,否则,就跳转到users路由上。
如此,handle方法就变成了如下形式:

 public function handle($request, Closure $next)
    {
        if($request->age <= 100){
                return redirect('users');
        }
        return $next($request);
    }

handle方法修改完成后,还需要在routes/web.php中添加一条路由,以方便进行测试:

Route::get('/mid/{age}', 'UserController@age')->middleware('age');

添加的这条路由中指定了处理的中间件是’age’。
因为指定了由UserController下的age方法来进行处理,所以需要在UserController下新增一个age方法:

扫描二维码关注公众号,回复: 1475733 查看本文章
public function age(){
        return "Hello,Age.....";
}

但现在如果直接调用的话,是找不到的这个中间件的,因为我们还没有注册这个中间件。
修改app\Http\Kernel.php文件,在其中的$routeMiddleware中添加我们新建的CheckAge中间件,注册为age:

'age'=> \App\Http\Middleware\CheckAge::class,

现在可以进行调试了。

当使用“http://ip:port/mid/22”来进行请求的时候,会发现实际浏览器中的实际url已经指向了“http://ip:port/users”,显示的也是路由users指向的页面内容。

当使用“http://ip:port/mid/222”来进行请求的时候,会发现浏览器正确指向了“/mid/{age}”路由指向的UserController@age方法,显示的正是age方法中的输出。

以上两种请求的方式,正是因为设置的CheckAge中间件的处理逻辑,导致的最后页面展示的不同。而这,也正是Laravel中间件主要的作用所在。

明白了中间件的作用与具体实现之后,其它的中间件组、全局中间件等也就好理解了,此些不再赘述。

猜你喜欢

转载自blog.csdn.net/ljl890705/article/details/78840778
今日推荐