热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:大白话Laravel中间件

本文由编程笔记#小编为大家整理,主要介绍了大白话Laravel中间件相关的知识,希望对你有一定的参考价值。Laravel
本文由编程笔记#小编为大家整理,主要介绍了大白话 Laravel 中间件相关的知识,希望对你有一定的参考价值。



Laravel 中间件是什么?

简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。


我们可以通过中间件实现以下功能:



  • 指定某些路由


  • 设置 HTTP 响应头


  • 记录请求


  • 过滤请求的参数


  • 决定是否启用站点维护模式


  • 响应前后做一些必要的操作



自定义中间件

命令行执行下面的简单命令,就可以轻松创建一个新的中间件









  1. php artisan make:middleware <MiddlewareName>





  2. //MiddlewareName 就是你要创建的中间件的名字





执行上面的命令,Laravel 会在 app/Http/Middleware 目录下自动创建一个只包含 handle 方法的中间件。









  1. php





  2. namespace App\Http\Middleware;





  3. use Closure;





  4. class RedirectIfSuperAdmin





  5. {





  6. /**





  7. * Handle an incoming request.





  8. *





  9. * @param \Illuminate\Http\Request $request





  10. * @param \Closure $next





  11. * @return mixed





  12. */





  13. public function handle($request, Closure $next)





  14. {





  15. return $next($request);





  16. }





  17. }





在中间件被调用的时候, handle 方法就会执行。这里需要注意的是 handle 方法默认有两个参数$request 和 $next$request 用来接受应用的请求组求, $next 将请求传递给应用程序。这两个参数是 handle 必不可少的!中间件也包括前置中间件和后置中间件。

“前置中间件” 顾名思义在将请求转发到应用程序之前处理一些逻辑。另一方面,在中间件之后,在应用程序处理了请求并生成响应之后运行。

前置中间件:









  1. php





  2. namespace App\Http\Middleware;





  3. use Closure;





  4. class RedirectIfSuperAdmin





  5. {





  6. /**





  7. * Handle an incoming request.





  8. *





  9. * @param \Illuminate\Http\Request $request





  10. * @param \Closure $next





  11. * @return mixed





  12. */





  13. public function handle($request, Closure $next)





  14. {





  15. //你的逻辑就在这里





  16. return $next($request);





  17. }





  18. }





后置中间件:









  1. php





  2. namespace App\Http\Middleware;





  3. use Closure;





  4. class RedirectIfSuperAdmin





  5. {





  6. /**





  7. * Handle an incoming request.





  8. *





  9. * @param \Illuminate\Http\Request $request





  10. * @param \Closure $next





  11. * @return mixed





  12. */





  13. public function handle($request, Closure $next)





  14. {





  15. $response = $next($request);





  16. //你的逻辑就在这里 例如 重定向到 `/`









  17. return $response;





  18. }





  19. }






中间件的类别



  • 全局中间件


  • 路由中间件


全局中间件针对命中应用程序的每个请求运行。Laravel 自带了大多数这些中间件例如 ValidatePostSize, TrimStrings, CheckForMaintenanceMode 等等.

路由中间件仅在它们所连接的路由上运行 例如 redirectIfAuthenticated.


注册中间件

创建的任何中间件都必须注册,因为这是 Laravel 知道存在的唯一方式。要注册中间件,只需打开名为 kernel.php 的文件,该文件位于 Http 文件夹中,如下所示:

This file contains list of all registered middlewares that come with Laravel by default. it contains three major arrays which 此文件包含默认 Laravel 提供的所有已注册中间件的列表。它包含三个主要的中间件组 $middleware , $middlewareGroups 和 $routeMiddleware









  1. php





  2. namespace App\Http;





  3. use Illuminate\Foundation\Http\Kernel as HttpKernel;





  4. class Kernel extends HttpKernel





  5. {





  6. /**





  7. * 应用程序的全局HTTP中间件。





  8. *





  9. * 这些中间件在应用程序的每个请求期间运行。





  10. *





  11. * @var array





  12. */





  13. protected $middleware = [





  14. \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,





  15. \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,





  16. \App\Http\Middleware\TrimStrings::class,





  17. \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,





  18. \App\Http\Middleware\TrustProxies::class,





  19. ];





  20. /**





  21. * 应用程序的路由中间件组.





  22. *





  23. * @var array





  24. */





  25. protected $middlewareGroups = [





  26. 'web' => [





  27. \App\Http\Middleware\EncryptCOOKIEs::class,





  28. \Illuminate\COOKIE\Middleware\AddQueuedCOOKIEsToResponse::class,





  29. \Illuminate\Session\Middleware\StartSession::class,





  30. // \Illuminate\Session\Middleware\AuthenticateSession::class,





  31. \Illuminate\View\Middleware\ShareErrorsFromSession::class,





  32. \App\Http\Middleware\VerifyCsrfToken::class,





  33. \Illuminate\Routing\Middleware\SubstituteBindings::class,





  34. ],





  35. 'api' => [





  36. 'throttle:60,1',





  37. 'bindings',





  38. ],





  39. ];





  40. /**





  41. * 应用程序的路由中间件.





  42. *





  43. * 可以将这些中间件分配给组或单独使用。





  44. *





  45. * @var array





  46. */





  47. protected $routeMiddleware = [





  48. 'auth' => \Illuminate\Auth\Middleware\Authenticate::class,





  49. 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,





  50. 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,





  51. 'can' => \Illuminate\Auth\Middleware\Authorize::class,





  52. 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,





  53. 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,





  54. //the just created middlware





  55. 'superadmin' => \App\Http\Middleware\RedirectIfSuperAdmin::class,





  56. ];





  57. }





$middleware 数组包含全局中间件,它运行应用程序的每个HTTP请求,所以如果你想为每个请求运行一个中间件,你应该在这里注册它。$middlewareGroups 使得可以在组中注册中间件,从而更容易通过使用组名将大量中间件附加到路由。$routeMiddleware 数组包含各个注册的路由中间件。


分配中间件

有两个主要方法可以把注册好的中间件应用到路由中。



  • 通过控制器的构造方法


  • 通过路由


通过构造方法分配中间件

通过构造方法分配中间有很大的灵活性,它提供了两个重要的方法 except($parameters) 和 only($parameters),这两个方法可以允许或阻止中间件应用到控制器中的辅助方法。不使用这两个方法,中间件将使用与控制器的每个方法。









  1. php





  2. use Illuminate\Http\Request;









  3. class ForumController extends Controller





  4. {









  5. public function __construct(){





  6. /**in this case the middleware named auth is applied





  7. to every single function within this controller





  8. */





  9. $this->middleware('auth');





  10. }









  11. public function viewForum(){









  12. return view('index');





  13. }









  14. public function edit($id){









  15. }









  16. public function delete($id){









  17. }









  18. }





使用 except 和 only 方法我们可以选择把中间件应用到指定方法。









  1. php





  2. use Illuminate\Http\Request;









  3. class ForumController extends Controller





  4. {









  5. public function __construct(){





  6. /**the authentication middleware here applies to all functions but





  7. viewForums() and viewForumDetails() and the opposite of this happens





  8. when you use only()





  9. */





  10. $this->middleware('auth')->except(['viewForums', 'viewForumDetails']);





  11. }









  12. public function viewForums(){









  13. return view('index');





  14. }









  15. public function edit($id){









  16. }









  17. public function delete($id){









  18. }









  19. public function viewForumDetails(){









  20. }





  21. }






通过路由分配中间件

如果注册的中间件可以直接附加到路由,如下所示:









  1. php





  2. //方法 1





  3. Route::get('admin/profile', function () {





  4. //action





  5. })->middleware('auth');









  6. /**方法 2





  7. 或者像这样使用完全限定的类名:





  8. */





  9. use App\Http\Middleware\CheckAge;









  10. Route::get('admin/profile', function () {





  11. // action





  12. })->middleware(CheckAge::class);









  13. //方法 3





  14. Route::group(['middleware' => ['web']], function () {





  15. //action





  16. });





N:B 中间件组可以像单个中间件一样分配给路由


中间件参数

其他参数可以传递给中间件。典型示例是将每个用户ID分配给角色,中间件检查用户的角色以确定是否有权访问所请求的 URI。参数可以传递给中间件,如下所示:









  1. php





  2. //方法1 (Through route)





  3. Route::get('admin/profile', function () {





  4. //action





  5. })->middleware('auth:'); // 这里应该被用户想要传递的任何参数替换。









  6. //方法2 (Through a controller)





  7. use Illuminate\Http\Request;









  8. class ForumController extends Controller





  9. {









  10. public function __construct(){





  11. $this->middleware('auth:');





  12. }





  13. }





通过用逗号分隔每个参数,可以将多个参数传递给中间件。









  1. php





  2. Route::get('admin/profile', function () {





  3. //action





  4. })->middleware('auth:,,'); //, , 这里应该被用户想要传递的任何参数替换。





这些参数在 $next 变量之后传递给中间件的 handle 函数









  1. php





  2. class RedirectIfSuperAdmin





  3. {





  4. /**





  5. * Handle an incoming request.





  6. *





  7. * @param \Illuminate\Http\Request $request





  8. * @param \Closure $next





  9. * @return mixed





  10. */





  11. public function handle($request, Closure $next, $role, $age, $country)





  12. {





  13. //使用解析参数的中间件逻辑





  14. return $next($request);





  15. }





  16. }






总结

要创建中间件,请执行以下过程



  • 使用 artisan 命令创建中间件 php artisan make:middleware中间件名.


  • 在app→Http文件夹中的 kernel.php 中注册中间件


  • 在创建的中间件中编写逻辑


  • 将中间件分配给路由或控制器



Conclusion

Laravel中间件可以更轻松地保护我们的路由,过滤输入并完成许多其他工作,而无需编写如此多的逻辑。查看官方 Laravel 文档 这里 了解中间件的更多功能,最重要的是练习。


推荐阅读
  • Request对象和Response对象request:(请求)当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。Djang ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 在一个包含四个活动的活动组中,作者遇到了一个屏幕方向的问题。在其中三个活动中,作者将屏幕方向设置为纵向,但需要一个活动在设备旋转时改变方向。通过删除ActivityGroup在AndroidManifest文件中的Portrait设置,作者解决了这个问题。 ... [详细]
  • linux6.5 配置邮件服务,centos 6.5服务器搭建邮件服务postfix和dovecot
    centos6.5搭建邮件服务postfix和dovecot------------------------------------------------安装DNS指定邮件交换记 ... [详细]
author-avatar
宫廷的围脖6uw_1911
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有