PHP中间件(middleware)解析

2 篇文章 0 订阅
2 篇文章 0 订阅


简介

中间件是一个闭包,而且返回一个闭包。中间件为过滤进入应用的HTTP请求提供了一套便利的机制,可以分为前置中间件和后置中间件。常用于验证用户是否经

过认证,添加响应头(跨域),记录请求日志等。


例子

<?php
// 框架核心应用层
$application = function($name) {
    echo "this is a {$name} application\n";
};

// 前置校验中间件
$auth = function($handler) {
    return function($name) use ($handler) {
        echo "{$name} need a auth middleware\n";
        return $handler($name);
    };
};

// 前置过滤中间件
$filter = function($handler) {
    return function($name) use ($handler) {
        echo "{$name} need a filter middleware\n";
        return $handler($name);
    };
};

// 后置日志中间件
$log = function($handler) {
    return function($name) use ($handler) {
        $return = $handler($name);
        echo "{$name} need a log middleware\n";
        return $return;
    };
};

// 中间件栈
$stack = [];

// 打包
function pack_middleware($handler, $stack)
{
    foreach (array_reverse($stack) as $key => $middleware) 
    {
        $handler = $middleware($handler);
    }
    return $handler;
}

// 注册中间件
// 这里用的都是全局中间件,实际应用时还可以为指定路由注册局部中间件
$stack['log'] = $log;
$stack['filter'] = $filter;
$stack['auth'] = $auth;

$run = pack_middleware($application, $stack);
$run('Laravle');
输出:

Laravle need a filter middleware
Laravle need a auth middleware
this is a Laravle application
Laravle need a log middleware


打包程序

中间件的执行顺序是由打包函数(pack_middleware)决定,这里返回的闭包实际上相当于:

$run = $log($filter($auth($application)));
$run('Laravle');


编写规范

中间件要要满足一定的规范:总是返回一个闭包,闭包中总是传入相同的参数(由主要逻辑决定), 闭包总是返回句柄(handler)的执行结果;

如果中间件的逻辑在返回句柄return $handler($name)前完成,就是前置中间件,否则为后置中间件。


注:图片来源于网络,如侵权删。


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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` 方法用于添加中间件到应用程序的中间件堆栈中。可以将多个中间件按顺序添加到堆栈中,它们将按顺序执行,并将控制权传递给下一个中间件或应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值