PHP:laravel中间件和控制器的请求参数传递与获取

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
性能测试 PTS,5000VUM额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: PHP:laravel中间件和控制器的请求参数传递与获取

image.png

目录

接口开发中,通常我们需要在中间件里边做一些全局性的前置判断,获取请求中的公共参数,然后传递给控制器

参考网络上的大部分文章,整理出以下传递参数的方式,并深入研究,作出一些思考

1、中间件和控制器测试

中间件

<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
/**
 * 测试中间件
 */
class TestMiddleware
{
    public function handle(Request $request, \Closure $next)
    {
        // 设置参数
        $request->attributes->set('name', 'Tom');
        return $next($request);
    }
}

控制器中取值

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
    public function index(Request $request): array
    {
        return [
            'name:input' => $request->input('name'),
            'name:get'   => $request->get('name')
        ];
    }
}

请求提交参数

{
    "name":  "Jack"
}

返回参数

{
  "data": {
    "name:input": "Jack",
    "name:get": "Tom"
  },
  "msg": "success",
  "code": 0
}

2、安全隐患

目前看,都挺好的

如果中间件中没有设置参数,就会取到用户传递过来的参数

public function handle(Request $request, \Closure $next)
    {
        // $request->attributes->set('name', 'Tom');
        return $next($request);
    }

如果用于安全性较高的场景,有点不适用

{
  "data": {
    "name:input": "Jack",
    "name:get": "Jack"
  },
  "msg": "success",
  "code": 0
}

假设,需要一个当前登录用户的id,假设是变量 current_login_user_id

如果我们没有加中间件,前端中接口中传递了这个参数,那么我们的代码将会出现安全隐患。

3、支持的传参方式

我们看下支持的传参方式

中间件

class TestMiddleware
{
    public function handle(Request $request, \Closure $next)
    {
        $request->name = 'prototype_name';
        $request->attributes->set('name', 'attr_name');
        return $next($request);
    }
}

控制器

public function index(Request $request): array
    {
        return [
            'name:prototype'  => $request->name,
            'name:input' => $request->input('name'),
            'name:query' => $request->query('name'),
            'name:attr'   => $request->get('name')
        ];
    }

请求

POST {{api_url}}/test?name=query_name
Content-Type: application/json; charset=utf-8
{
    "name":  "post_name"
}
{
    "name:prototype": "prototype_name",
    "name:input": "post_name",
    "name:query": "query_name",
    "name:attr": "attr_name"
}

如果取消中间件,发现数据并不是所期待的那样,取到null值

{
    "name:prototype": "post_name",
    "name:input": "post_name",
    "name:query": "query_name",
    "name:attr": "query_name"
}

4、总结

综上,可以采用如下方式传递中间件参数到控制器是可行的

// 中间件设置值 设置为null,就算请求参数中携带了name, 也能取到null值
$request->attributes->set('name', null);
// 控制器取值
$request->get('name')

看下get的实现代码

public function get(string $key, mixed $default = null): mixed
    {
        if ($this !== $result = $this->attributes->get($key, $this)) {
            return $result;
        }
        if ($this->query->has($key)) {
            return $this->query->all()[$key];
        }
        if ($this->request->has($key)) {
            return $this->request->all()[$key];
        }
        return $default;
}
public function get(string $key, mixed $default = null): mixed
{
        return \array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
}

array_key_exists 意味着,如果设置了值,就会直接返回,不再往下查找其他值

5、一种更为安全的做法

一种更为安全的做法,是建立一个枚举变量,来替代字符串变量

const key = '192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'
// 就算没有设置值,也不会错误的从请求参数中获取值
$value = input->get(key)

利用Python,可以很容易生成这种很长的数字

Python编程:使用os.urandom生成Flask的秘钥SECRET_KEY


相关文章
|
4月前
|
中间件 PHP 调度
深入浅出PHP框架之Laravel的优雅
【10月更文挑战第3天】在PHP的世界里,Laravel以其优雅和简洁闻名。本文将带你走进Laravel的世界,探索它的魔法。我们将通过代码示例,一步步揭示Laravel的魅力。准备好,让我们一起开始这场奇妙的旅程吧!
|
3月前
|
缓存 安全 PHP
深入浅出PHP框架之Laravel的优雅与实用
【10月更文挑战第22天】在PHP的世界里,Laravel如同一股清流,以其优雅的设计和实用的功能赢得了广大开发者的喜爱。本文将带你走进Laravel的世界,探索其背后的设计哲学,以及如何利用Laravel构建高效、可维护的Web应用。从路由到模型,从控制器到视图,我们将一步步揭开Laravel的神秘面纱。
89 3
|
4月前
|
设计模式 监控 中间件
深入理解PHP中的中间件模式
【10月更文挑战第20天】探索PHP编程世界中的“交通枢纽”——中间件模式。从代码层面剖析如何实现请求和响应的高效管理,以及如何在开发中应用这一模式来增强项目的扩展性和维护性。
|
4月前
|
中间件 PHP 开发者
深入理解PHP中的中间件模式
【10月更文挑战第6天】在PHP开发中,中间件模式是一种优雅的处理请求和响应的方式。本文将带你探索中间件模式的概念、实现及其在PHP框架中的应用,同时提供实用的代码示例来加深理解。
|
3月前
|
设计模式 缓存 中间件
探索PHP中的中间件模式
【10月更文挑战第33天】在编程世界中,设计模式是解决常见问题的模板。本文将带你领略PHP中中间件模式的魅力,它如何优雅地处理请求,并保持代码的整洁与可维护性。通过实际代码示例,我们将一步步实现一个简单的中间件框架,让你轻松理解并应用到自己的项目中。
|
3月前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
4月前
|
存储 前端开发 PHP
深入浅出PHP框架之Laravel的优雅
【9月更文挑战第31天】在编程世界里,PHP语言如同一位多才多艺的老匠人,而Laravel框架则是其手中的精工细作。本文将带你领略Laravel的魅力所在,从其优雅的设计哲学到实用的功能特性,再到如何通过实际代码示例掌握它的核心操作。让我们一起探索Laravel的世界,发现编程之美。
102 6
|
5月前
|
设计模式 缓存 中间件
深入理解PHP中的中间件模式
【9月更文挑战第12天】本文旨在通过浅显易懂的语言和实际代码示例,引导读者了解PHP中如何实现和使用中间件模式,以及这一设计模式如何优化我们的应用程序结构。文章将逐步介绍中间件的概念、在PHP中的应用实例,以及如何自定义中间件来解决实际问题。
|
6月前
|
安全 前端开发 PHP
构建与验证表单:传统PHP与Laravel框架的比较分析——探索Web开发中表单处理的优化策略和最佳实践
【8月更文挑战第31天】在 Web 开发中,表单构建与数据验证至关重要。传统 PHP 方法需手动处理 HTML 表单和数据验证,而 Laravel 框架则提供了一种更现代、高效的解决方案。本文通过对比传统 PHP 和 Laravel 的方法,探讨表单构建与验证的最佳实践。Laravel 通过简洁的语法糖、内置的数据过滤和验证机制,显著提升了代码的安全性和可维护性,适用于大型项目或需要快速开发的场景。然而,在追求灵活性的小型项目中,直接使用 PHP 仍是不错的选择。了解两者的优劣,有助于开发者根据项目需求做出最佳决策。
57 0
|
6月前
|
设计模式 JavaScript 中间件
探索PHP中的中间件模式
【8月更文挑战第31天】本文将带你领略PHP编程世界中的“交通枢纽”——中间件模式。我们将从中间件的概念出发,逐步深入到如何在PHP项目中实现并应用这一设计模式。通过实际代码示例,你将学会如何构建自己的中间件,以及如何利用它们来简化项目结构、增强代码可读性和可维护性。准备好了吗?让我们一起走进PHP中间件的世界,解锁更多可能!