2012-07-23 49 views
2

我有一个自建的MVC fw,其中包含路由器路由URL,以便使用常见的example.com/controller/action。我遇到问题时,我的应用程序是一个子目录内部署的诸如从URI和Web根提取公共路径

example.com/my_app/controller/action/?var=value

我的路由器认为my_app是控制器的名称现在和controller是方法。

我目前的解决方案是在安装时手动要求配置中的任何子目录名称。我想手动执行此操作。看到我的问题,让我知道如果我要解决这个错误的方式,并提出错误的问题。

我的问题: 如果我有两条路径,我该如何从一条路径的末尾截断公共段并将它从另一条路径的末尾移除。

A = /无功/网络/程序my_app /酒馆 B =/my_app应用/酒吧/ CNTRL/ACTN

什么是你最快的一个衬垫从B拆下/ my_app应用/酒馆,并保持与/ CNTRL/ACTN? 基本上寻找一种perl-esque方式来获得像字符串一样的公分母。

感谢任何输入

+0

您是在寻找PHP还是Perl? – 2012-07-23 22:36:09

+0

两者都很好,但我的代码是PHP。 – dlite922 2012-07-23 22:37:47

回答

1

我会解决这是在加入这个逻辑来front controller(到你的服务器发送的所有不存在的文件请求的文件,通常的index.php)的方式。

$fontControllerPath = $_SERVER['SCRIPT_NAME']; 
$frontControllerPathLength = strlen($fontControllerPath); 

$frontControllerFileName = basename($fontControllerPath); 
$frontControllerFileNameLength = strlen($frontControllerFileName); 

$subdirectoryLength = $frontControllerPathLength - $frontControllerFileNameLength; 

$url = substr($_SERVER['REQUEST_URI'], $subdirectoryLength - 1); 

Here's a codepad demo

这是干什么的?如果前端控制器位于(相对于www根目录):/subdir/myapp/,那么它的$_SERVER['SCRIPT_NAME']将是/subdir/myapp/index.php。实际的请求URI包含在$_SERVER['REQUEST_URI']中。比方说,它是/subdir/myapp/controller/action?extras=stuff。要删除子目录前缀,我们需要找到它的长度。这是通过从脚本名称相对于www根的长度中减去脚本名称的长度(从basename()中检索)找到的。

File that receives request: /subdir/myapp/index.php (length = 23) 
Filename: index.php         (length = 9) 
                   - 
------------------------------------------------------------------- 
               14 chars to remove 

/subdir/mpapp/controller/action?extras=stuff 
      ^
       Cut off everything before here 
+0

不完全是我需要但非常接近!这是一行'substr($ _ SERVER ['REQUEST_URI'],0,strlen($ _ SERVER ['SCRIPT_NAME']) - strlen(basename($ _ SERVER ['SCRIPT_NAME'])))''我刚刚更改了substr ()来获取路径的第一部分(/ subdir/mpapp /)而不是控制器/操作部分。 – dlite922 2012-07-24 15:49:28

3
my @physical_parts = split qr{/}, $physical_path; 
my @logical_parts = split qr{/}, $logical_path; 

my @physical_suffix; 
my @logical_prefix; 
my $found = 0; 
while (@physical_parts && @logical_parts) { 
    unshift @physical_suffix, pop(@physical_parts); 
    push @logical_prefix, shift(@logical_parts); 

    if (@physical_suffix ~~ @logical_prefix) { 
     $found = 1; 
     last; 
    } 
} 
+0

尽管这可能起作用,但它太过于强悍。这将会在每一次单页加载时完成,所以需要快速的完成。 PhpMyCoder更符合我所需要的(我会减少他的解决方案) – dlite922 2012-07-24 15:34:54

+0

你说从example.com/my_app/controller/action/?var = value'开始。我按照你的指示,而PhpMyCoder从'$ SCRIPT_NAME'开始('/ controller/action /?var = value')。如果这是可以接受的,当然可以。 – ikegami 2012-07-24 18:41:21