当前位置: 首页 > wzjs >正文

福州做网站o2o电子商务平台有哪些

福州做网站,o2o电子商务平台有哪些,佛山网站建设案例,建站之星7大核心价值原文地址: 实现一个中间件 更多内容请关注:php代码框架 理解中间件 中间件(Middleware) 是一种在请求被路由到控制器方法之前或响应返回客户端之前执行的代码。它通常用于处理通用任务,如身份验证、日志记录、CORS 处理等。 在…

 原文地址: 实现一个中间件 更多内容请关注:php代码框架

理解中间件

中间件(Middleware) 是一种在请求被路由到控制器方法之前或响应返回客户端之前执行的代码。它通常用于处理通用任务,如身份验证、日志记录、CORS 处理等。

在本例中,认证中间件将检查用户是否已登录,若未登录,则重定向到登录页面。


定义中间件接口

首先,定义一个中间件接口,确保所有中间件类都实现该接口。这有助于保持中间件的一致性和可扩展性。

步骤:

  1. 创建 Middleware 接口

    在 src/Middleware/ 目录下创建 Middleware.php 文件,并定义接口:

    <?php
    // src/Middleware/Middleware.phpnamespace MyFrameworkMiddleware;interface Middleware
    {/*** 处理请求** @param array $params 路由参数* @return bool 返回 `true` 继续执行,`false` 中止执行*/public function handle($params);
    }
    ?>

    说明:

    • handle 方法:接收路由参数,执行中间件逻辑。返回 true 表示请求可以继续执行,返回 false 则中止执行。


创建认证中间件

接下来,创建具体的认证中间件,实现上述接口。

步骤:

  1. 创建 AuthenticationMiddleware 类

    在 src/Middleware/ 目录下创建 AuthenticationMiddleware.php 文件:

    <?php
    // src/Middleware/AuthenticationMiddleware.phpnamespace MyFrameworkMiddleware;class AuthenticationMiddleware implements Middleware
    {public function handle($params){session_start();if (isset($_SESSION['user'])) {// 已认证,允许继续return true;} else {// 未认证,重定向到登录页面header('Location: /login');exit();}}
    }
    ?>

    说明:

    • 认证逻辑:检查 $_SESSION['user'] 是否存在,判断用户是否已登录。

    • 未认证处理:若未登录,使用 header 函数重定向到 /login 路由,并使用 exit() 终止脚本执行。


更新路由器以支持中间件

为了让路由器能够识别和执行中间件,需要对现有的 Router 类进行修改。

步骤:

  1. 扩展路由定义以包含中间件

    修改 Router 类,使其能够接受中间件参数。

  2. 更新 Router.php 文件

    在 src/Router.php 中进行如下修改:

    <?php
    // src/Router.phpnamespace MyFramework;use MyFrameworkMiddlewareMiddleware;class Router
    {private $routes = [];/*** 添加路由规则** @param string $method HTTP 方法(GET, POST, etc.)* @param string $uri 请求的 URI,支持参数,例如 '/user/{id}/profile'* @param string $action 控制器和方法,例如 'UsersController@showProfile'* @param array $middlewares 中间件列表*/public function add($method, $uri, $action, $middlewares = []){// 转换 URI 模式为正则表达式,并提取参数名称$pattern = preg_replace_callback('/{([a-zA-Z0-9_]+)(?)?}/', function ($matches) {$param = $matches[1];$optional = isset($matches[2]) && $matches[2] === '?';if ($optional) {return '(?P<' . $param . '>[a-zA-Z0-9_-]+)?';} else {return '(?P<' . $param . '>[a-zA-Z0-9_-]+)';}}, $uri);// 支持可选参数后的斜杠$pattern = preg_replace('#//+#', '/', $pattern);$pattern = '#^' . $pattern . '(/)?$#';// 提取参数名称$params = $this->extractParams($uri);$this->routes[] = ['method'      => strtoupper($method),'pattern'     => $pattern,'action'      => $action,'params'      => $params,'middlewares' => $middlewares];}/*** 分发请求到相应的控制器方法** @param string $requestMethod HTTP 方法* @param string $requestUri 请求的 URI*/public function dispatch($requestMethod, $requestUri){foreach ($this->routes as $route) {if ($route['method'] === strtoupper($requestMethod)) {if (preg_match($route['pattern'], $requestUri, $matches)) {// 提取命名参数$params = [];foreach ($route['params'] as $param) {if (isset($matches[$param]) && $matches[$param] !== '') {$params[$param] = $matches[$param];}}// 执行中间件foreach ($route['middlewares'] as $middlewareClass) {$middleware = new $middlewareClass();if ($middleware instanceof Middleware) {if (!$middleware->handle($params)) {// 中间件中止请求return;}}}$this->executeAction($route['action'], $params);return;}}}// 如果没有匹配的路由,返回 404$this->sendNotFound();}// ... 其他方法保持不变 ...
    }
    ?>

    说明:

    • 路由定义扩展:add 方法现在接受一个可选的 $middlewares 数组,用于指定该路由需要执行的中间件。

    • 中间件执行:在匹配路由后,遍历中间件列表,实例化并调用其 handle 方法。如果任何中间件返回 false,则中止请求处理。


应用中间件到路由

现在,指定哪些路由需要执行认证中间件。

步骤:

  1. 添加需要认证的路由

    在 index.php 中,定义需要认证的路由,并为其指定认证中间件。例如:

    <?php
    // index.phpuse MyFrameworkRouter;
    use MyFrameworkMiddlewareAuthenticationMiddleware;// ... 之前的代码 ...// 定义带有中间件的路由
    $router->add('GET', '/users', 'UsersController@list', [AuthenticationMiddleware::class]);
    $router->add('GET', '/user/{id}', 'UsersController@show', [AuthenticationMiddleware::class]);
    $router->add('GET', '/user/{id}/info/{info?}', 'UsersController@info', [AuthenticationMiddleware::class]);// 定义无需认证的登录路由
    $router->add('GET', '/login', 'AuthController@showLoginForm');
    $router->add('POST', '/login', 'AuthController@login');// 其他无需认证的路由
    $router->add('GET', '/', 'HomeController@index');
    $router->add('GET', '/about', 'HomeController@about');
    $router->add('GET', '/contact', 'HomeController@contact');
    $router->add('POST', '/submit', 'HomeController@submit');// 处理请求
    $router->dispatch($requestMethod, $requestUri);
    ?>

    说明:

    • 指定中间件:为需要认证的路由添加 [AuthenticationMiddleware::class],这将确保这些路由在执行控制器方法前进行身份验证。

    • 登录路由例外:登录相关的路由(如 /login)无需认证,因此不指定中间件。

  2. 创建认证控制器

    需要确保有一个 AuthController,包含 showLoginForm 和 login 方法,用于显示登录表单和处理登录逻辑。

    <?php
    // src/Controllers/AuthController.phpnamespace MyFrameworkControllers;use MyFrameworkController;
    use MonologLogger;
    use MonologHandlerStreamHandler;class AuthController extends Controller
    {private $logger;public function __construct(){$this->logger = new Logger('auth');$this->logger->pushHandler(new StreamHandler(__DIR__ . '/../../logs/app.log', Logger::DEBUG));}public function showLoginForm(){// 显示登录表单echo '<form method="POST" action="/login"><label>用户名: <input type="text" name="username" required></label><br><label>密码: <input type="password" name="password" required></label><br><button type="submit">登录</button></form>';}public function login(){// 处理登录逻辑$username = $_POST['username'] ?? '';$password = $_POST['password'] ?? '';// 简单示例:假设用户名和密码均为 'admin'if ($username === 'admin' && $password === 'admin') {session_start();$_SESSION['user'] = $username;$this->logger->info("用户登录成功", ['username' => $username]);header('Location: /users');exit();} else {$this->logger->warning("用户登录失败", ['username' => $username]);echo "<p>登录失败,请重试。</p>";$this->showLoginForm();}}public function logout(){session_start();unset($_SESSION['user']);session_destroy();header('Location: /login');exit();}
    }
    ?>

    说明:

    • 登录逻辑:在 login 方法中验证用户凭证,成功后将用户信息存入 $_SESSION,并重定向到受保护的路由。

    • 登出功能:可选,提供 logout 方法以允许用户登出。


处理认证逻辑

在认证中间件和认证控制器中正确处理用户会话和认证状态。

关键点:

  1. 会话管理

    • 在中间件和控制器中使用 session_start() 来管理会话。

    • 确保在每个需要访问 $_SESSION 的地方调用 session_start()

  2. 保护受限路由

    • 使用认证中间件保护所有需要认证的路由。

    • 确保登录路由不受认证中间件保护,以防止死循环重定向。

  3. 重定向逻辑

    • 未认证用户访问受限路由时,中间件将其重定向到登录页面。

    • 登录成功后,用户被重定向到之前尝试访问的受限页面,或默认的受限页面(如 /users)。


总结

通过以上步骤,在自定义的 PHP 框架中成功添加了身份认证的中间件,实现了以下功能:

  1. 中间件接口:定义了一个通用的中间件接口,确保所有中间件的一致性。

  2. 认证中间件:实现了 AuthenticationMiddleware,用于检查用户是否已登录。

  3. 路由器增强:更新了 Router 类,使其能够识别和执行路由中指定的中间件。

  4. 路由定义更新:在路由定义中为需要认证的路由指定了认证中间件,确保这些路由在访问前进行身份验证。

  5. 认证控制器:创建了 AuthController,包含显示登录表单和处理登录逻辑的方法。

扩展建议:

  1. 中间件堆栈:支持为路由指定多个中间件,按顺序执行。

  2. 全局中间件:实现全局中间件功能,对所有路由统一应用某些中间件(如日志记录)。

  3. 中间件参数:允许为中间件传递参数,以增强中间件的灵活性。

  4. 更复杂的认证机制:集成更安全的认证机制,如密码哈希、令牌验证等。

  5. 错误处理:增强中间件中的错误处理,提供更友好的错误信息和页面。


文章转载自:

http://bYLnnlOU.jcfdk.cn
http://5VGyMcur.jcfdk.cn
http://shb3mtIv.jcfdk.cn
http://aLDyWOOK.jcfdk.cn
http://hWe86d74.jcfdk.cn
http://qWuSX9Wp.jcfdk.cn
http://FAPGyPi9.jcfdk.cn
http://apZ5rhTR.jcfdk.cn
http://vwkeqsP3.jcfdk.cn
http://SVCXDI5y.jcfdk.cn
http://quTrJVnf.jcfdk.cn
http://mVLGEu9m.jcfdk.cn
http://qghIoZbJ.jcfdk.cn
http://9mn2jmSi.jcfdk.cn
http://OSjfX8Wv.jcfdk.cn
http://EHLOggNf.jcfdk.cn
http://OE3OgEOX.jcfdk.cn
http://c9JAWbih.jcfdk.cn
http://xofwxIuY.jcfdk.cn
http://6lfSQjZK.jcfdk.cn
http://GxSXiUtF.jcfdk.cn
http://h0lwwByS.jcfdk.cn
http://LTmtKLdI.jcfdk.cn
http://mYk5GHTL.jcfdk.cn
http://n7UKoBNR.jcfdk.cn
http://hRjpgLpO.jcfdk.cn
http://ep0TloWy.jcfdk.cn
http://En9PXuhC.jcfdk.cn
http://1AtVo8O2.jcfdk.cn
http://j51r5iPf.jcfdk.cn
http://www.dtcms.com/wzjs/613312.html

相关文章:

  • 班级网站怎么做网页制作网站首页不在第一位
  • 郑州网站建设没效果企业个人网站
  • 旅游商城网站模板网站百度商桥
  • 有没有什么网站做卷子创建软件网站
  • 关键词挖掘站长工具wordpress 自动发表
  • 网站服务包括什么昌吉哪个公司做网站
  • 西安英文网站建设微信公众号平台官网免费注册
  • 典当行网站源码宁波seo在线优化公司
  • 人防网站建设与服务注册网站需要备案吗
  • 商河便宜做网站的公司网站建设在哪里申请
  • 郑州惠济区建设局网站有限责任公司设立条件
  • 广州网站建设好评公司app跟网站的区别是什么
  • 国外建站推广建立网站的步骤和费用
  • 优化百度网站什么网站是html5做的
  • 国内vps做网站备案偃师制作网站
  • 东莞哪家做网站很有名的公司搜索引擎网络推广公司上海
  • 王也的配音员是谁优化技术基础
  • 网站不能访问的原因阜新全网营销网站建设
  • 公共部门网站建设维护寿光网站建设推广
  • seo关于网站搜索排名网站建设 聊城
  • 深圳网站建设网络推广公司网站开发的实训报告
  • 网站关键词设置汉中建设工程招标新闻中心
  • 广州网站建站公司菜篮网网站开发技术
  • 河北云网站建设页面设计好吗
  • 哪里可以做公司网站备案中国购物平台排名
  • html5网站源码下载免费制作小说封面的网站
  • 微信 网站 收费标准免费网站空间和域名
  • 网站链接锚点怎么做息壤空间怎么上传网站
  • 网站建设 服务内容东营有做网站的公司
  • 深圳住房建设局官方网站展馆展示设计公司哪家好一点