laravel $request 多维数组取值_大白话 Laravel 中间件
Laravel 中间件是什么?
简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。
我们可以通过中间件实现以下功能:
指定某些路由
设置 HTTP 响应头
记录请求
过滤请求的参数
决定是否启用站点维护模式
响应前后做一些必要的操作
自定义中间件
命令行执行下面的简单命令,就可以轻松创建一个新的中间件
php artisan make:middleware <MiddlewareName>
//MiddlewareName 就是你要创建的中间件的名字
执行上面的命令,Laravel 会在 app/Http/Middleware
目录下自动创建一个只包含 handle
方法的中间件。
php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
在中间件被调用的时候, handle
方法就会执行。这里需要注意的是 handle
方法默认有两个参数$request
和 $next
。$request
用来接受应用的请求组求, $next
将请求传递给应用程序。这两个参数是 handle
必不可少的!中间件也包括前置中间件和后置中间件。
“前置中间件” 顾名思义在将请求转发到应用程序之前处理一些逻辑。另一方面,在中间件之后,在应用程序处理了请求并生成响应之后运行。
前置中间件:
php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//你的逻辑就在这里
return $next($request);
}
}
后置中间件:
php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
//你的逻辑就在这里 例如 重定向到 `/`
return $response;
}
}
中间件的类别
全局中间件
路由中间件
全局中间件针对命中应用程序的每个请求运行。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
php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* 应用程序的全局HTTP中间件。
*
* 这些中间件在应用程序的每个请求期间运行。
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
];
/**
* 应用程序的路由中间件组.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* 应用程序的路由中间件.
*
* 可以将这些中间件分配给组或单独使用。
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
//the just created middlware
'superadmin' => \App\Http\Middleware\RedirectIfSuperAdmin::class,
];
}
$middleware
数组包含全局中间件,它运行应用程序的每个HTTP请求,所以如果你想为每个请求运行一个中间件,你应该在这里注册它。$middlewareGroups
使得可以在组中注册中间件,从而更容易通过使用组名将大量中间件附加到路由。$routeMiddleware
数组包含各个注册的路由中间件。
分配中间件
有两个主要方法可以把注册好的中间件应用到路由中。
通过控制器的构造方法
通过路由
通过构造方法分配中间件
通过构造方法分配中间有很大的灵活性,它提供了两个重要的方法 except($parameters)
和 only($parameters)
,这两个方法可以允许或阻止中间件应用到控制器中的辅助方法。不使用这两个方法,中间件将使用与控制器的每个方法。
php
use Illuminate\Http\Request;
class ForumController extends Controller
{
public function __construct(){
/**in this case the middleware named auth is applied
to every single function within this controller
*/
$this->middleware('auth');
}
public function viewForum(){
return view('index');
}
public function edit($id){
}
public function delete($id){
}
}
使用 except
和 only
方法我们可以选择把中间件应用到指定方法。
php
use Illuminate\Http\Request;
class ForumController extends Controller
{
public function __construct(){
/**the authentication middleware here applies to all functions but
viewForums() and viewForumDetails() and the opposite of this happens
when you use only()
*/
$this->middleware('auth')->except(['viewForums', 'viewForumDetails']);
}
public function viewForums(){
return view('index');
}
public function edit($id){
}
public function delete($id){
}
public function viewForumDetails(){
}
}
通过路由分配中间件
如果注册的中间件可以直接附加到路由,如下所示:
php
//方法 1
Route::get('admin/profile', function () {
//action
})->middleware('auth');
/**方法 2
或者像这样使用完全限定的类名:
*/
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
// action
})->middleware(CheckAge::class);
//方法 3
Route::group(['middleware' => ['web']], function () {
//action
});
N:B 中间件组可以像单个中间件一样分配给路由
中间件参数
其他参数可以传递给中间件。典型示例是将每个用户ID分配给角色,中间件检查用户的角色以确定是否有权访问所请求的 URI。参数可以传递给中间件,如下所示:
php
//方法1 (Through route)
Route::get('admin/profile', function () {
//action
})->middleware('auth:'); // 这里应该被用户想要传递的任何参数替换。
//方法2 (Through a controller)
use Illuminate\Http\Request;
class ForumController extends Controller
{
public function __construct(){
$this->middleware('auth:');
}
}
通过用逗号分隔每个参数,可以将多个参数传递给中间件。
php
Route::get('admin/profile', function () {
//action
})->middleware('auth:,,'); //, , 这里应该被用户想要传递的任何参数替换。
这些参数在 $next
变量之后传递给中间件的 handle 函数
php
class RedirectIfSuperAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $role, $age, $country)
{
//使用解析参数的中间件逻辑
return $next($request);
}
}
总结
要创建中间件,请执行以下过程
使用 artisan 命令创建中间件
php artisan make:middleware中间件名
.在app→Http文件夹中的 kernel.php 中注册中间件
在创建的中间件中编写逻辑
将中间件分配给路由或控制器
Conclusion
Laravel中间件可以更轻松地保护我们的路由,过滤输入并完成许多其他工作,而无需编写如此多的逻辑。查看官方 Laravel 文档 这里 了解中间件的更多功能,最重要的是练习。
laravel $request 多维数组取值_大白话 Laravel 中间件相关推荐
- laravel $request 多维数组取值_Laravel 运行原理分析与源码分析,底层看这篇足矣
精选文章内容 一.运行原理概述 laravel的入口文件 index.php 1.引入自动加载 autoload.php 2.创建应用实例,并同时完成了: 基本绑定($this.容器类Containe ...
- laravel $request 多维数组取值_3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据...
引言 上一章我们教会大家如何从用户表单内正确地获取数据,可是没有讲,获取到的数据到底有啥用,或者说,有的用户提交的数据压根儿就没正经填,那些错乱无效的数据,如果直接放到数据库,纯粹是对数据库的污染. ...
- laravel $request 多维数组取值_3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?...
引言 web应用程序公开访问几乎没有不带用户交互的,难免要接收用户输入的奇奇怪怪的东西.对于后端程序,必须对输入的内容进行有效性过滤. 这就是本文的重点,说一说laravel中输入请求的校验. 学习时 ...
- 一道简单的多维数组取值问题
问题简述 给予一个多维数组和一个描述取值路径的一维数组, 通过调用函数f返回取值路径描述的值,如 f([[1, 2], [3, 4], [5, 6]], [0, 0]) -> 1 原问题传送门 ...
- php输出二维函数,兼容php二维数组取值函数array_column使用
PHP5.5发布,其中增加了一个新的数组函数array_column,感觉不错的! 但是低版本PHP要使用,得自己实现: if(!function_exists('array_column')){ f ...
- 【C 语言】数组 ( 数组取值操作 | array[i][j] 用法 等价于 *( *(array = i) + j ) 用法 | 下标操作到指针操作演化过程 )
文章目录 一.数组取值操作方法 二.一维数组取值 下标操作到指针操作 演化过程 三.二维数组取值 下标操作到指针操作 演化过程 一.数组取值操作方法 给定一个二维数组 : int array[2][3 ...
- c++如何定义二维数组结构体_原来数组还可以这么玩(宏把数组玩坏了)
点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 想起青春追寻的昨天,你也是曾经追风的少年. 文 章 导 读 今天给小伙伴们介绍下用宏对数组值进行分类使用的方式,比较大的程序中的寄存器经常会这 ...
- php 数值相加_php递归遍历多维数组,合并值并相加
php递归遍历多维数组,合并值并相加 作者:jao 发布于:2018-11-24 18:05 分类:PHP教程 弄了3个小时,一直在想如何合并多维数组,并且把值相加. 想到的是遍历数组,于是不断的百度 ...
- vue 取数组第一个值_vue遍历对象中的数组取值示例
前几天小项目,没考虑周全,让后端改接口,改成数组中包含对象中包含数组的形式,后来越琢磨越不对,后台把所有数据放在了一个对象里,我拿弹窗数据不好拿,索性又改了回来,把后端折腾够呛,自己也折腾够呛,发上来 ...
最新文章
- 二者取其一(初遇)_网络流
- ue编辑器拖拽上传图片_为百度UE编辑器上传图片添加水印功能
- JAVA——声明包类的编译与运行解决方案
- 我的Git使用-资料查询,名博笔记
- Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
- 手机用计算机怎么求最高分,计算机中求最高分怎么算【excel 如何去掉一个最高分和一个最低分求平均数】...
- 更改计算机时间出现没有权限,win7系统修改时间时显示没有权限的解决方法
- 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
- 如何优雅的实现一个九宫格抽奖
- java txt转pdf乱码,openoffice将txt文本转pdf中文乱码
- Revit API、AddInManager、RevitLookup、SDK的用途
- 计算机学校宣传片创意和构思,【差一步就会02】用PPT做影视宣传片
- 防火墙单向访问控制_使用防火墙实现安全的访问控制
- 简单的网页设计,以学校官网为例
- 英语词根记忆法(6)
- 死锁的定义和产生条件以及如何避免死锁
- 无需投资,小白在家也能闲鱼店创业赚钱,教你月入10000+丨国仁网络资讯
- idea插件开发(5)-Swing图形化设计
- Listener method could not be invoked with the incoming message消息队列RabbitMQ项目启动报错及监听队列报错
- can总线rollingcounter_汽车CAN总线详解
热门文章
- js input点击事件_Vue.js的旅程,简单的todo实例「602」
- c语言文件打开函数,C语言fopen函数中文件打开方式(参数值)
- mysql在linux下的安装_mysql在linux下的安装
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
- 路由有类查找和无类查找方式
- 笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new...
- mysql 数据库引擎常识全集
- 为什么函数式编程很重要:不一样的白板图
- Http 请求处理流程(转)
- java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例