• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于PHP部分框架中 action 参数绑定的原理

php 搞代码 4年前 (2022-01-23) 24次浏览 已收录 0个评论
文章目录[隐藏]

例如THINKPHP

<code>class xxController{    public function index($id,$age)    {        //这些参数是通过$_GET['id'],$_GET['age']来的            }}//按PHP的实现方法大致应该是以下$ctr = new xxController();return $ctr->index(); //他这里怎么有知道应该传哪些参数呢?!//本人愚钝,我想不是这样做的,那应该是怎么实现呢?!!请各位大神讲解一下其中的实现原理!</code>

回复内容:

例如THINKPHP

<code>class xxController{    public function index($id,$age)    {        //这些参数是通过$_GET['id'],$_GET['age']来的            }}//按PHP的实现方法大致应该是以下$ctr = new xxController();return $ctr->index(); //他这里怎么有知道应该传哪些参数呢?!//本人愚钝,我想不是这样做的,那应该是怎么实现呢?!!请各位大神讲解一下其中的实现原理!</code>

反射,通过反射得的类的方法的参数列表。然后对应起来就可以。

<code><?php/** * 一个用于测试的类 * Class TestController */class TestController {    /**     * 嗯,著名的hello world     * @param $name     */    public function helloWordAction($name)    {        echo "hello {$name}!".PHP_EOL;    }}# 通过反射进行参数绑定调起类的方法# @see http://php.net/manual/zh/book.reflection.php# 方法,从路由获取的,类也是由路由获取的,这里意思一下就好了$action = 'helloWordAction';# 传进来的参数,从路由获取的$paramsInput['name'] = 'toozy';# 获取类的反射$controllerReflection = new ReflectionClass(TestController::class);# 不能实例化,就是不能new一个的话,这个游戏就玩不下去了啊if (!$controllerReflection->isInstantiable()) {    throw new RuntimeException("{$controllerReflection->getName()}不能被实例化");}# 获取对应方法的反射if (!$controllerReflection->hasMethod($action)) {    throw new RuntimeException("{$controllerReflection->getName()}没有指定的方法:{$action}");}$actionReflection = $controllerReflection->getMethod($action);# 获取方法的参数的反射列表(多个参数反射组成的数组)$paramReflectionList = $actionReflection->getParameters();# 参数,用于action$params = [];# 循环参数反射# 如果存在路由参数的名称和参数的名称一致,就压进params里面# 如果存在默认值,就将默认值压进params里面# 如果。。。没有如果了,异常foreach ($paramReflectionList as $paramReflection) {    # 是否存在同名字的路由参数    if (isset($paramsInput[$paramReflection->getName()])) {        $params[] = $paramsInput[$paramReflection->getName()];        continue;    }    # 是否存在默认值    if ($paramReflection->isDefaultValueAvailable()) {        $params[] = $paramReflection->getDefaultValue();        continue;    }    # 异常    throw new RuntimeException(        "{$controllerReflection->getName()}::{$actionReflection->getName()}的参数{$paramReflection->getName()}必须传值"    );}# 调起$actionReflection->invokeArgs($controllerReflection->newInstance(), $params);</code>

保存为:reflection.php

<code>root@work:/media/sf_project/php-hello-world# php refrection.php hello toozy!</code>

这种情况的框架都有一个“路由定义”,客户端只能匹配到定义好的路由,包含了路径、Method、以及请求参数。
拿 Laravel 举例:

<code>Route::get('api/article/{articleId}', 'ArticleController@articleDetail');//...ArticleController extends Controller{    public function articleDetail($articleId)    {        //...    }}</code>

在匹配路由过程,/本2文来源[email protected]搞@^&代*@码2网搞gaodaima代码因为定义的这个路由包含了{articleId} 这个约定好形式的占位符,路由模块会匹配包含 articleId 的 URL,并获取到参数值传给对应 Controller 的 action。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于PHP部分框架中 action 参数绑定的原理
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址