Laravel路由中不固定数量的参数如何实现?
前言
laravel是个好框架,我也在学习和使用,并且在公司里推广,最近在读 Laravel 源码的时候,发现了一个段特别有趣的代码,大家请看:
... 这三个点是做什么用的呢?我查了 PHP 的手册后发现,这个东西叫做可变数量的参数列表。
这个是干啥用的呢?PHP 手册是这么解释的。
... 是用户自定义函数中支持可变数量的参数列表。
... 存在于 PHP 5.6 及以上的版本中。 在 PHP 5.5 及更早版本中,使用函数 func_num_args()
,func_get_arg()
,和 func_get_args()
。
可变数量的参数列表,这个概念可能你会觉得很抽象。
我们可以这么来理解,我们自定义了一个函数或者某个 function,但是这个 function 的参数数量是不固定的,这也就是可变数量的参数列表。
关于可变数量的参数列表,让我们来看两个示例;
1
2
3
4
5
6
7
8
9
10
|
<?php function sum(... $numbers ) { $acc = 0; foreach ( $numbers as $n ) { $acc += $n ; } return $acc ; } echo sum(1, 2, 3, 4); ?> |
以上例程会输出:
10
可变数量参数将被传递到 function 中,给定的参数变量会作为数组。
我们再看一个示例:
1
2
3
4
5
6
|
<?php function add( $a , $b ) { return $a + $b ; } echo add(...[1, 2]) ?> |
以上例程会输出:
3
可变数量参数将被传递到 function 中,给定的数组会作为参数变量。
这个可变数量参数,又和 Laravel 路由有什么关系呢?
在 Laravel 中,我们自定义路由是非常自由的,比如是这样的:
1
2
3
4
5
6
|
Route::get( 'user/{id}' , 'UsersController@filter' ); //路由对应的方法 public function filter( $id ) { # code... } |
或许有可能这样的:
1
2
3
4
5
6
|
Route::get( 'user/{id}/{name}' , 'UsersController@filter' ); //路由对应的方法 public function filter( $id , $name ) { # code... } |
Laravel 路由中这样不固定数量参数,在代码中是如何实现的呢?使用的就是可变数量参数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// */vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php /** * Dispatch a request to a given controller and method. * * @param \Illuminate\Routing\Route $route * @param mixed $controller * @param string $method * @return mixed */ public function dispatch(Route $route , $controller , $method ) { $parameters = $this ->resolveClassMethodDependencies( $route ->parametersWithoutNulls(), $controller , $method ); if (method_exists( $controller , 'callAction' )) { return $controller ->callAction( $method , $parameters ); } return $controller ->{ $method }(... array_values ( $parameters )); } |
不得不让人佩服 Laravel 作者泰勒脑路清奇啊!
总结
http://www.pdfxs.com/search?q=MIAD-918
Laravel路由中不固定数量的参数如何实现?的更多相关文章
- php可变数量的参数
PHP 在用户自定义函数中支持可变数量的参数列表.在 PHP 5.6 及以上的版本中,由 ... 语法实现:在 PHP 5.5 及更早版本中,使用函数 func_num_args(),func_get ...
- php 可变数量的参数列表
可变数量的参数列表 PHP 在用户自定义函数中支持可变数量的参数列表.在 PHP 5.6 及以上的版本中,由 ... 语法实现:在 PHP 5.5 及更早版本中,使用函数func_num_args() ...
- 原来 laravel 路由 参数可以为可选。。。 很灵活
基本路由 您的应用程序的绝大多数路由将在 app/routes.php 文件中定义.Laravel 中最简单的路由由一个 URI 和一个闭包调用组成. 基本 GET 路由 复制代码代码如下: Rout ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- ionic的学习-02路由中的几个参数
Part1 路由中的几个参数 第一步:看几个参数的位置 ①ionic中是通过<ion-nav-view></ion-nav-view>实现不同模板渲染跳转的. ②ionic中 ...
- #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著,但并不是越多越好),加上verbose=True,显示进程使用信息
#调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著) from sklearn import datasets X, y = datasets.make_c ...
- Android中当item数量超过一定大小RecyclerView高度固定
Android中当item数量超过一定大小时,将RecyclerView高度固定 方法1 直接通过LayoutParams来设定相应高度 ViewGroup.LayoutParams lp = rv. ...
- laravel路由组中namespace的的用法详解
做公司一个项目的时候发现laravel框架中可以省去action的路径前缀的用法: ps:用简短的话来理解就是说在路由组中定义namespace,可以省去你路由的前缀下面看例子 最终显示如下: 定义的 ...
随机推荐
- KMP(超详细复杂度分析)
从 stackoverflow中找到了一个时间复杂度分析很棒的链接 https://www.inf.hs-flensburg.de/lang/algorithmen/pattern/kmpen.htm ...
- HDOJ-3038(带权并查集)
How many answers wrong HDOJ-3038 一个很好的博客:https://www.cnblogs.com/liyinggang/p/5327055.html #include& ...
- Microsoft Teams 2021最新功能发布解读 – 会议篇
正在进行的2021年的Microsoft Ignite大会,发布了一系列跟Microsoft Teams相关的新功能,英文介绍请参考 https://techcommunity.microsoft.c ...
- pytorch(15)损失函数
损失函数 1. 损失函数概念 损失函数:衡量模型输出与真实标签的差异 \[损失函数(Loss Function): Loss = f(\hat y,y) \] \[代价函数(Cost Function ...
- MySQL深入研究--学习总结(3)
前言 接上文,继续学习后续章节.细心的同学已经发现,我整理的并不一定是作者讲的内容,更多是结合自己的理解,加以阐述,所以建议结合原文一起理解. 第九章<普通索引和唯一索引,如何选择> 从查 ...
- js 数组的浅拷贝和深拷贝
1.背景介绍 javascript分原始类型与引用类型.Array是引用类型,直接用"="号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,指向的是同一个内存地址,其中一个 ...
- redis过期key监听事件
目录 redis安装 docker拉取 启动 redis 配置 命令监听 问题 程序监听 具体监听类 效果 总结 redis常用语缓存操作,但是redis功能不仅仅于此.今天我们来看看redis的ke ...
- C# 应用 - 多线程 6) 处理同步数据之手动同步 AutoResetEvent 和 ManualResetEvent
1. 类的关系 AutoResetEvent 和 ManualResetEvent 都继承自 System.Threading.EventWaitHandle 类(EventWaitHandle 继承 ...
- P1162_填涂颜色(JAVA语言)(速看!全洛谷最暴力解法!QAQ)
思路:看了看数据n<=30,于是我们可以暴力求解(主要是BFS学的不咋地~2333).枚举每个0的位置,看上下左右四个方向上是否都有1.都有1的话说明被1包围,即在闭合圈的内部,开个数组标记一下 ...
- IDA 创建本地类型
在IDA中我们常常使用 shift+F9打开结构体视图,ins 创建结构体,但操作有些繁琐. 我们可以在View-->Open Subviews-->Local Types(视图--> ...