Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用php前端控制器实现动态路由_Php_Front Controller - Fatal编程技术网

用php前端控制器实现动态路由

用php前端控制器实现动态路由,php,front-controller,Php,Front Controller,我正在尝试从URL获取控件名,并在index.php中动态地将其与正确的控制器匹配 我的应用程序根目录:/localhost/app/index.php 基本上,当我输入/localhost/app/index.php/home,试图输入home\u controller.php时。 这是代码 $parts = array_slice(explode('/',$_SERVER["REQUEST_URI"]),3); if(file_exists(dirname(__FILE__)."/con

我正在尝试从URL获取控件名,并在index.php中动态地将其与正确的控制器匹配

我的应用程序根目录:/localhost/app/index.php

基本上,当我输入/localhost/app/index.php/home,试图输入home\u controller.php时。 这是代码

 $parts = array_slice(explode('/',$_SERVER["REQUEST_URI"]),3);
 if(file_exists(dirname(__FILE__)."/controllers/".$parts[0].'_controller.php'))
 {
    include dirname(__FILE__)."/controllers/".$parts[0].'_controller.php';
 }
如果应用程序根深度为3,则可以正常工作。当我像这样更改应用程序目录时,它被破坏了 localhost/first/second/app/index.php/home

因为它爆炸了3,$parts[0]不再是“家”
问题是如何以更有效的方式检测控制器部件?

/localhost/app/index.php/home localhost/first/second/app/index.php/home
听起来它让你的字符串$parts[0]看起来像app/index.php/home,这将是一个无效路径。处理此问题的唯一方法是使用/作为分隔符分解该字符串,或者使用数组中的最后一个作为比较或遍历每个字符串的位置。MVC的概念是URL的结构总是与第一部分类似,在这种情况下需要确定控制器,2+通常用于引用控制器中函数的参数

我使用$\u SERVER paht\u info变量来计算控制器部分

  $segments = array_slice(explode("/", $_SERVER["PATH_INFO"] ),1);
$segment数组的零索引是控制器部分,其他部分是函数。
顺便说一句,您需要检查数组边界以及是否设置了路径信息

多谢各位。我没有使用CI。在使用“/”分解之后,我仍然会使用localhost、first、second、app、index.php、home。。我不想在这个数组中循环以找到正确的控制器。正如您所看到的,它效率不高。。如果url是localhost/first/second/app/index.php/home/settings,那么如果反向运行会发生什么情况?我只想调用home controller的设置功能@克里斯只是在想一些疯狂的事情,哈哈。这些都不会对你的结局有什么好处。