关于PHP部分框架中action参数绑定的原理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了关于PHP部分框架中action参数绑定的原理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2403字,纯文字阅读大概需要4分钟。
内容图文
例如THINKPHPclass xxController
{
public function index($id,$age)
{
//这些参数是通过$_GET['id'],$_GET['age']来的
}
}
//按PHP的实现方法大致应该是以下
$ctr = new xxController();
return $ctr->index(); //他这里怎么有知道应该传哪些参数呢?!
//本人愚钝,我想不是这样做的,那应该是怎么实现呢?!!请各位大神讲解一下其中的实现原理!
回复内容:
例如THINKPHP
class xxController
{
public function index($id,$age)
{
//这些参数是通过$_GET['id'],$_GET['age']来的
}
}
//按PHP的实现方法大致应该是以下
$ctr = new xxController();
return $ctr->index(); //他这里怎么有知道应该传哪些参数呢?!
//本人愚钝,我想不是这样做的,那应该是怎么实现呢?!!请各位大神讲解一下其中的实现原理!
反射,通过反射得的类的方法的参数列表。然后对应起来就可以。
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);
保存为:reflection.php
root@work:/media/sf_project/php-hello-world# php refrection.php
hello toozy!
这种情况的框架都有一个“路由定义”,客户端只能匹配到定义好的路由,包含了路径、Method、以及请求参数。
拿 Laravel 举例:
Route::get('api/article/{articleId}', 'ArticleController@articleDetail');
//...
ArticleController extends Controller
{
public function articleDetail($articleId)
{
//...
}
}
在匹配路由过程,因为定义的这个路由包含了{articleId}
这个约定好形式的占位符,路由模块会匹配包含 articleId 的 URL,并获取到参数值传给对应 Controller 的 action。
内容总结
以上是互联网集市为您收集整理的关于PHP部分框架中action参数绑定的原理全部内容,希望文章能够帮你解决关于PHP部分框架中action参数绑定的原理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。