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' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::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!

 

转载于:https://www.cnblogs.com/kidsitcn/p/6224003.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP 中,中间件(Middleware)是一种常见的设计模式,用于在应用程序的请求-响应周期中执行某些操作。中间件可以用于处理请求、响应、日志记录、缓存、身份验证、授权等操作。PHP 中的许多框架都支持中间件,例如 Laravel、Symfony、Slim 等。 在 PHP 中,中间件通常由一个可调用对象(callable)表示,它接受请求对象和响应对象作为参数,并返回响应对象。在框架中,中间件通常通过栈(stack)的方式组织,每个中间件都可以对请求和响应进行处理,并将控制权传递给下一个中间件或应用程序。 以下是一个示例中间件的代码: ``` class MyMiddleware { public function __invoke($request, $response, $next) { // 执行某些操作,例如记录日志、验证身份等 // ... // 将控制权传递给下一个中间件或应用程序 return $next($request, $response); } } ``` 在上面的示例中,`$next` 参数是一个可调用对象,它表示下一个中间件或应用程序。通过调用 `$next($request, $response)`,可以将控制权传递给下一个中间件或应用程序。 要将中间件添加到应用程序中,通常可以使用框架提供的中间件堆栈(middleware stack)或管道(pipeline)机制。例如,在 Laravel 中,可以使用以下代码将中间件添加到应用程序中: ``` $app->middleware([ MyMiddleware::class, // ... ]); ``` 在上面的示例中,`$app` 是应用程序实例,`middleware` 方法用于添加中间件到应用程序的中间件堆栈中。可以将多个中间件按顺序添加到堆栈中,它们将按顺序执行,并将控制权传递给下一个中间件或应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值