当你使用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!

laravel middleware的更多相关文章

  1. php.laravel.middleware

    关于中间件,在php-laravel中的定义就是对请求的一个过滤,相当于JSP技术中的filter的存在.需要知道编写了一个中间件可以配置在三个地方(就目前5.7版本而言)让其发挥作用,具体需要看/a ...

  2. PHP and laravel知识点小小积累

    function () use ($x, &$y){} 自从PHP5.3开始有了closure/匿名函数的概念,在这里的use关键词的作用是允许匿名函数capture到父函数scope 内存在 ...

  3. 手摸手教你让Laravel开发Api更得心应手

    https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...

  4. laravel框架的中间件middleware的详解

    本篇文章给大家带来的内容是关于laravel框架的中间件middleware的详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. laravel中间件是个非常方便的东西,能将一些逻辑 ...

  5. laravel中间件-----------middleware

    middleware中间件 是访问到达服务器后在被对应的路由处理之前所经过的一层过滤层,故称中间件. 中间件是存放在app\http\middleware中,需要定一个 handle 处理方法,在ha ...

  6. Laravel 5.1 ACL权限控制 四 之middleware

    1.创建Middleware php artisan make:middleware MustBeAnAdmin 2.实现 MustBeAnAdmin.php中的handle方法,判断登录的用户是否为 ...

  7. 在Laravel中使用Middleware进行身份验证

    新建一个中间件: 方法写在handle中 判断用户是否登录而且是否是管理员,不是的话返回到主页 新建判断是否为管理员的方法 在kernel定义一个中间件,key是admin 注册群组路由:prefix ...

  8. Laravel 控制器的middleware中间件

    场景:活动开始前只能访问宣传页面,开始后才可以访问其他页面: 步骤: 新建中间件, 注册中间件, 使用中间件, 中间件的前置和后置操作. 控制器: public function activity0( ...

  9. laravel App\Kernel.php中的middleware、middlewareGroups、routeMiddleware

    万事万物总逃不出一个理字,程序尤其如此,你之所以活得轻松,是因为有人替你负重前行,帮你屏蔽掉了很多乱七八糟的事情,但总有一天你要直面这些事情.程序亦是如此,某个框架你用的很轻松,那是因为底层逻辑已经有 ...

随机推荐

  1. Javac的命令(注解相关)

    1.-Akey[=value] Options to pass to annotation processors. These are not interpreted by javac directl ...

  2. JavaScript设计模式-19.代理模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. ubuntu16.04下ftp服务器的安装与配置

    由于要将本地程序上传至云服务器中,所以需要给云服务器端安装ftp服务器.记录一下ftp的安装过程,以便以后使用.服务器端所用系统为Ubuntu16.04. 1. 安装ftp服务器, apt-get i ...

  4. [转]Charts (Report Builder and SSRS)

    本文转自:https://docs.microsoft.com/en-us/sql/reporting-services/report-design/charts-report-builder-and ...

  5. td 不换行 隐藏显示多余的部分(转)

    转自:http://sha-tians.iteye.com/blog/1996162 table中td固定宽度后overflow:hidden不生效的问题 博客分类: html/css/js   前两 ...

  6. jquery里判断数组内是否包含了指定的值或元素的方法

    本文讲的是在jquery里,如何判断一个数组里是否包含了指定的值,变量,或其它对象元素的方法. 在jquery里,我们可以用$.inArray来判断一个数组里是否包含了指定的值或其它对象元素,来看一个 ...

  7. LINQ-Where子句与select子句

    1.Where子句 where子句的作用就是筛选元素,除了开始喝结束位置,where子句几乎可以出现在LINQ表达式的任意位置.一个LINQ表达式中可以有Where子句,也可以没有:可以有一个,可以有 ...

  8. vscode下eslint代码规范

    直接上规范吧: // 将设置放入此文件中以覆盖默认设置 { "editor.fontSize": 17, "editor.tabSize": 2, " ...

  9. ASP.Net之一般处理程序

    1.静态语言和动态语言 静态语言:在服务器端,不会被执行,直接作为 字符串 发回给浏览器,由浏览器运行的语言( HTML+CSS+JS).   动态语言:在服务端,会被服务器端的某种语言的虚拟机执行的 ...

  10. 关系型数据库之MySQL基础总结_part1

    一:数据库的操作语言的种类 MySQL 是我们最常使用的关系型数据库,对于MySQL的操作的语言种类又可以分为:DDL,DML,DCL,DQL DDL:是数据库的定义语言:主要对于数据库信息的一些定义 ...