【问题标题】:dynamic routing with php front controller带有php前端控制器的动态路由
【发布时间】:2011-10-07 22:09:05
【问题描述】:

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

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

所以基本上当我键入 /localhost/app/index.php/home 时,试图包含 home_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] 不再是“家” 问题是如何以更有效的方式检测控制器部分?

【问题讨论】:

    标签: php front-controller


    【解决方案1】:

    我使用 $_SERVER paht_info 变量来计算,控制器部分..

      $segments = array_slice(explode("/", $_SERVER["PATH_INFO"] ),1);
    

    $segment 数组的零索引是控制器部分,其他部分是函数。 顺便说一句,您需要检查数组边界以及是否设置了 path_info。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。我没有使用 CI。在用“/”爆炸后,我仍然会有 localhost、first、second、app、index.php、home.. 我不想在这个数组中循环以找到正确的控制器。如您所见,它效率不高.. 还有如果反向运行,如果 url 是 localhost/first/second/app/index.php/home/settings,会发生什么?我只想调用家庭控制器的设置功能。 @克里斯
      • 我只是在想一些疯狂的事情,哈哈。对于听起来可能是你的最终游戏的东西,这些都不会很好地工作。
      猜你喜欢
      • 2020-10-22
      • 2012-11-07
      • 2015-11-30
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2017-10-17
      相关资源
      最近更新 更多