Laravel参数化中间件深入潜水

>我正在阅读一篇有关参数化中间件的文章,而我在想参数的奇怪语法。它看起来像是静态方法调用中的错字,someclass :: class。’:: somemethod’。
如果该参数比字符串更复杂,例如基本枚举。 进入水

,所以我查看了中间件方法的代码。

    /**     * get or set the middlewares attached to the route.     *     * @param  array|string|null  $middleware     * @return $this|array     */    public function middleware($middleware = null)    {        if (is_null($middleware)) {            return (array) ($this->action['middleware'] ?? []);        }        if (! is_array($middleware)) {            $middleware = func_get_args();        }        foreach ($middleware as $index => $value) {            $middleware[$index] = (string) $value;        }        $this->action['middleware'] = array_merge(            (array) ($this->action['middleware'] ?? []), $middleware        );        return $this;    }

>这向我表明,无论您添加到方法中的任何参数,中间件定义总是会转换为字符串。

为什么这会发生?
>

戴上氧气罐和潜水口罩

>我打开了xdebug,并在中间件类手柄方法中添加了一个断点。当我浏览呼叫堆栈时,我找到了创建管道的路由器runroutewithinstack方法。

return (new pipeline($this->container))                        ->send($request)                        ->through($middleware)                        ->then(fn ($request) => $this->prepareresponse(                            $request, $route->run()                        ));

在添加的中间件上循环的管道类循环的当时方法。

public function then(closure $destination)    {        $pipeline = array_reduce(            array_reverse($this->pipes()), $this->carry(), $this->preparedestination($destination)        );        return $pipeline($this->passable);    }

>在随身携带方法中,有一项检查允许类和参数的拆分。

} elseif (! is_object($pipe)) {                        [$name, $parameters] = $this->parsepipestring($pipe);                        // if the pipe is a string we will parse the string and resolve the class out                        // of the dependency injection container. we can then build a callable and                        // execute the pipe function giving in the parameters that are required.                        $pipe = $this->getcontainer()->make($name);                        $parameters = array_merge([$passable, $stack], $parameters);                    }

,所以现在我们到达了进行实际分裂的方法,parsepipestring。

protected function parsepipestring($pipe)    {        [$name, $parameters] = array_pad(explode(':', $pipe, 2), 2, []);        if (is_string($parameters)) {            $parameters = explode(',', $parameters);        }        return [$name, $parameters];    }

>这种方法带来的额外条件是参数是用逗号识别的。因此,someclass :: class。’:[a,b]’将导致[‘[a”,’b]’]。在这次潜水中,我找到了三个地方,在三个地方执行了字符串类型
>

路由中间件方法

管道携带方法,因为它隐含地期望字符串

管道parsepipestring方法 回到干燥的土地上如果中间件方法确实接受了类似;的类别怎么办

final readonly class pipelineclass {   public function __constructor(public string $class, public mixed $options) {      $this->validate($class);   }   private function validate(string $class) {      if(!is_callable($class)) {         throw new \exception("$class is not callable.");      }       }}

在管道携带方法中

if (is_callable($pipe)) {// code} elseif (! is_object($pipe)) {// code} else {// code}

>

if($pipe instanceof PipelineClass){// code} elseif (is_callable($pipe)) {// code} elseif (is_string($pipe)) {// code} else {// code}

在代码中还有其他几个地方检查了类和参数语法。因此他们也需要更改。

我想知道参数语法是否足以容纳使用该功能的人,还是创建自己的参数语法以使提供更多信息成为可能?

以上就是Laravel参数化中间件深入潜水的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1252649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月10日 00:09:55
下一篇 2025年12月8日 06:38:08

相关推荐

  • PHP7的版本选择是否和框架有关

    PHP 7 版本选择与框架息息相关,但并非直接相关。在选择版本时,需要考虑以下因素:框架要求:选择框架支持的 PHP 版本。性能:较新版本通常性能更好,但提升幅度有限。新特性:最新版本可能引入新特性,但未必有用或增加复杂度。兼容性:选择广泛支持的版本,避免第三方库或代码不兼容问题。安全:较高版本包含…

    2025年12月10日
    000
  • Laravel Blueprint 构建快速 Laravel 应用程序

    Laravel 开发者必备利器:Blueprint!本文将分享如何利用 Laravel Blueprint 显著提升开发效率,特别是数据库迁移、模型和工厂的创建。 数据库迁移:高效便捷 Blueprint 不仅仅是简单的建表工具,它能快速有效地搭建整个数据库环境。只需几行代码,即可定义表结构、字段和…

    2025年12月10日
    000
  • 优化Laravel应用程序性能的提示

    Laravel应用的性能直接影响用户体验。本文将分享十个有效提升Laravel应用性能的技巧,涵盖缓存策略、数据库优化等方面,助您缩短加载时间,提升服务器效率,最终优化应用速度。 巧用路由缓存 重要性: Laravel每次请求都加载路由,大量路由会拖慢响应速度。路由缓存可有效解决此问题。 操作方法:…

    2025年12月10日
    000
  • 使用Ruby实施Bayarcash付款API:验证校验和

    集成支付平台时,缺乏目标语言的文档往往令人头疼。最近,我协助吉隆坡一家旅行社ZFB Travel在其Ruby on Rails后端集成了马来西亚本地支付平台Bayarcash。Bayarcash文档虽然提供了PHP示例,却缺少Ruby版本,给Rails开发者带来了挑战。 本文将逐步指导您如何在Rai…

    2025年12月10日
    000
  • 构建了一个将面试准备过程变成博客文章的功能

    我开发了一个工具,利用Claude 3生成PHP面试准备资源,并将其自动转换为博客文章。此工具涵盖了面试中可能遇到的问题、答案和提示,帮助求职者更好地准备面试。 该工具的输出示例可见于:https://www.php.cn/link/4d1d732a3fd7efdacb4b26a0ca945eba …

    2025年12月10日
    000
  • 修复Laravel中的TL不足:使用免费安全工具指南

    修复 laravel 中的 tls 安全漏洞:完整指南及免费安全工具 传输层安全协议 (TLS) 保证客户端与服务器之间数据交换的加密与安全。Laravel 应用中 TLS 配置不足可能导致敏感数据泄露,造成严重安全风险。本指南将结合代码示例和工具(包括我们的免费网站安全扫描工具)讲解如何识别和解决…

    2025年12月10日
    000
  • 受邀参加会议的最大员工数

    2127。最大的员工被邀请参加会议 > 难度: hard 主题:深度优先搜索,图形,拓扑排序 >一家公司正在组织会议,并有n名员工名单,等待被邀请。他们已经安排了一张大圆桌会议,能够座位员工的任何数字。 员工的编号为0到n -1。每个员工都有一个> 的人,他们才会参加会议>,…

    2025年12月10日
    000
  • 我只是不能! nextjs?

    技术选型往往取决于个人偏好。不同开发者青睐不同的技术栈,这很正常!我个人偏好并非放之四海而皆准。我不执着于单一语言环境,反而更喜欢多语言协同工作。 我曾独立开发过许多React应用,但近来频率有所下降。目前主要使用Go (Echo或Fiber)、Django和Laravel (已成为我的最爱!)。 …

    2025年12月10日
    000
  • PHP特征:可重复使用的代码的秘密调味料

    “我需要在多个类中使用相同的功能,但继承并不适用?” Traits就像代码复用的秘诀——灵活、高效,能解决继承无法独自处理的问题。让我们一步步了解Traits(保证不会枯燥)。 PHP Traits究竟是什么? 简单来说,PHP Traits是一种在不使用正式继承的情况下,将方法注入类的方式。假设您…

    好文分享 2025年12月10日
    000
  • PHP 8如何进行安全编码实践

    PHP 8 安全编码方法:使用预处理语句或参数化查询防止 SQL 注入。对用户输入进行严格验证和过滤以抵御 XSS 攻击。使用输出编码函数(如 htmlspecialchars())保护输出免受 XSS 攻击。定期更新软件和第三方库,培养良好的安全编程习惯。 PHP 8安全编码:编写坚不可摧的代码 …

    2025年12月10日 好文分享
    000
  • PHP 8如何使用Web Application Firewall

    通过在 PHP 8 应用中集成 Web 应用程序防火墙 (WAF),可有效提升安全性:WAF 监控并拦截恶意流量,保护应用免受 SQL 注入和跨站脚本攻击等威胁。PHP 8 的安全特性与 WAF 协同工作,提供多层次防护。根据应用需求定制 WAF 规则可实现精准防护。选择 WAF 时考虑性能、规则定…

    2025年12月10日
    000
  • Drupal人工智能模块

    drupal 中的 ai 代理:简化网站构建和内容创建 Drupal 的 AI 代理功能正在改变网站构建和内容创建的方式。本文将引导您逐步了解如何安装和配置 Drupal 的 AI 模块,并利用其强大的功能。 文章开头提出一个关键问题:AI 代理是否会取代数字营销人员和网站建设者?答案是:至少对于某…

    2025年12月10日 好文分享
    000
  • PHP7的不同版本在速度上有明显区别吗

    PHP7不同版本的速度差异主要取决于代码、运行环境、扩展库等因素,而非版本号递增。关键影响因素包括:Opcode缓存:启用OPcache至关重要,不同的实现方式影响性能。代码质量:优化代码可显著提升速度,优于升级PHP版本。数据库:优化数据库查询和索引可极大提升整体性能。扩展库:选择性能良好的扩展库…

    2025年12月10日
    000
  • PHP 8如何进行输入过滤

    PHP 8 中的输入过滤是构建安全应用的基础,提供了多层次的防御。核心过滤函数包括 htmlspecialchars()(防止 XSS)、strip_tags()(移除 HTML 标签)、filter_var()(使用预定义或自定义过滤器)。filter_var() 灵活且强大,支持自定义过滤器。常…

    2025年12月10日
    000
  • Day Laravel Asana API Integration

    将asana api集成到laravel应用程序中,实现项目管理自动化 Asana是一款流行的项目管理工具,能够帮助团队组织、跟踪和管理工作。通过将Asana API集成到你的Laravel应用程序,你可以实现任务自动化、获取项目数据并简化工作流程。本文将指导你完成这一集成过程。 前提条件 在开始之…

    2025年12月10日 好文分享
    000
  • 通过将 ZendPHP 与 PhpStorm 集成来优化 PHP Web 应用程序

    许多 PHP 团队选择利用集成开发环境 (IDE)(例如 PhpStorm)来提高其关键任务应用程序的性能。然而,尽管 PhpStorm 很受欢迎,但它远不是唯一可用的优化工具,了解您的选项对于管理成功的 Web 应用程序至关重要。 在 在这篇博客中,我概述了为什么 PHP IDE 经常被选择 开发…

    2025年12月10日
    000
  • 如何在 Laravel Blade 中使用 Bootstrap 分页(教程)

    本教程演示如何在 Laravel Blade 模板中集成 Bootstrap 分页功能。我们将创建一个示例应用,播种 10000 条电影数据,并利用 Bootstrap 和 Laravel Blade 将其分页显示。 教程也涵盖了在 Laravel 11 中使用 Larapex Charts 包创建…

    2025年12月10日
    000
  • 如何在 Laravel 中将文件从一个文件夹移动到另一个文件夹

    本教程演示如何在 Laravel 应用中移动文件。我们将提供关键示例,讲解如何在 Laravel 中将文件从一个文件夹移动到另一个文件夹,甚至跨磁盘移动文件。Laravel 提供了文件和存储外观,以及文件系统方法,方便实现此功能。我们将展示两种方法的语法示例,适用于 Laravel 5 至 Lara…

    2025年12月10日
    000
  • PHP 开发人员主管指南

    Supervisor是一个功能强大的进程控制系统,广泛应用于后台进程管理。对于PHP开发者而言,经常需要处理长时间运行的进程、队列任务和其他后台作业,Supervisor能够简化这一过程,确保进程持续运行,并在进程异常终止时自动重启,同时提供便捷的监控和管理功能。 本文将指导您如何配置和使用Supe…

    2025年12月10日
    000
  • 如何在 Laravel 11 中使用 Larapex Charts 包创建动态 Apexcharts

    本教程演示如何在 Laravel 11 应用中利用 Larapex Charts 包创建动态 Apexcharts 图表。 Apexcharts 是一款 JavaScript 库,用于构建美观的交互式网页图表。它支持多种图表类型(例如柱状图、折线图、饼图等),方便数据可视化。用户可自定义图表外观、设…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信