• laravel middleware


    当你使用larvel创建一个相对比较复杂的web网站时,往往你的routes文件就会变得很庞大。一般来说在开始网站编码之前,最好做一个整体规划,把这些route逻辑上划分为不同的group,每一个group来定一个对应的middleware来控制这些route的访问。比如admin,auth,public等逻辑大块。通常每一个这样的路由集都对应这不同的middleware,比如admin往往需要admin的middleware,必须具备管理员权限的人才允许访问。public则是所有登录用户,甚至无需登录的任何用户都可以访问的routes. 另外,API group可能需要不同的auth middleware, 比如可能需要一个API相关的rate limiter或者其他的东西。

    Laravel 5.2引入了一个middleware group的概念,实际上也就是使用一个名称就可以应用一大堆的middleware。

    如何创建一个admin的middleware group

    我们可以在app/Http/Kernel.php文件中定义middelware group.

    Kernel类中定义了一个$middlewareGroups数组属性,我们就在这里来定义新的middlewarep group。看看下面的代码就是laravel自带的middlewaregroup:

    protected $middlewareGroups = [
        'web' => [
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
            AppHttpMiddlewareVerifyCsrfToken::class,
        ],
    
        'api' => [
            'throttle:60,1',
        ],
    ];

    从上面的例子我们就可以看到,这个数组中的key(web,api)可以引用一个class类,或者一个route-specific middleware shortcut,比如throttle, 或者auth. 甚至web, api也可以被其他的key来引用

    现在我们来这么定义:

    protected $middlewareGroups = [
        'web' => [...],
        'api' => [...],
        'admin' => [
            'web',
            'auth',
        ]
    ];

    通过上面的代码,我们就定义了一个admin middlewaregroup,这个group使用了web(这又是另外一个middleware group),和一个auth(named route middleware).

    你可能注意到了在web middlware group中定义的middleware在laravel 5.1中实际上是被应用到了每一个route上的,比如cookie,session,csrf等。但是从5.2开始对于这个做了比较大的改变:任何没有被应用上web这个middleware group的route都将不具备cookie和session或者csrf的功能!

    这也给了我们更多的灵活性:比如我们可以创建stateless的API而不用每次都应用那些middleware,也意味着性能的提高.

    有必要指出的是:任何依赖于cookie或者session或者csrf的API将不能正常工作,如果他们被放在api 这个middlewaregroup下的话。所以,如果你有一些API是stateful的,那么你需要对默认的api middlewaregroup做一些调整。

    使用middlewaregroups

    routes.php文件中:

    Route::get('/', function () {
        return view('welcome');
    });
    
    Route::group(['middleware' => ['web']], function () {
        //
    });
    Route::group(['middleware' => 'admin'], function () {
        Route::get('dashboard', function () {
            return view('dashboard');
        });
    });

    在5.2的后期版本,作者做了一下变更,在RouteServiceProvider中默认所有在routes.php文件中定义的route都将被应用了'web'这个middlewaregroup!

  • 相关阅读:
    jQuery Deferred和Promise的使用介绍:
    asp.net客户端IP跟踪
    jquery常用的一些方法
    前端音频流播放
    c# Http请求下载二进制流文件
    iView表格行验证问题
    【已解决】Https请求—未能创建 SSL/TLS 安全通道
    安全开发规范
    数据库设计规范
    高性能开发规范
  • 原文地址:https://www.cnblogs.com/kidsitcn/p/6224003.html
Copyright © 2020-2023  润新知