【问题标题】:turn URL route into funciton arguments php mvc将 URL 路由转换为函数参数 php mvc
【发布时间】:2011-05-05 21:52:14
【问题描述】:

我正在为一个 PHP 项目编写一个自定义 MVC 框架,在从 URL 路由获取参数之前,一切都很好。我坚持将部分 URL 路由动态地传递给函数参数。我已经有一个方法,它只是用于内爆路由并使用数组作为函数参数,但我真的很想知道如何像在 CodeIgnitor 或 CakePHP 中那样做。

这就是我想要做的。网站网址将是...

url: http://yoursite.com/profile/view/35/foo

在我的控制器中我会...

<?php

Class profileController Extends baseController 
{

    public function view($ID, $blah)
    {
        echo $ID; //would show 35
        echo $blah; //would show foo
    }

}

?>

我真的很想知道这是怎么做到的。非常感谢!

【问题讨论】:

    标签: php model-view-controller url-routing


    【解决方案1】:

    处理此问题的最简单方法是使用 call_user_func_array() 函数。您可以按如下方式使用它:

    call_user_func_array(array($controller, $method), $params);
    

    $controller 将是您已经创建的控制器对象,而 $method 将是控制器的方法。然后 $params 是从 URI 收集的参数数组。您只需要取出 URI 的控制器/方法部分。

    您也可以使用Reflection 执行此操作,但这通常比使用上述方法要慢。

    【讨论】:

    • 是的,非常感谢,我正在做一些研究,而我发现 call_user_func_array 并且它运行良好。再次感谢!
    【解决方案2】:

    对于任何想知道我最终做了什么的人,最终代码如下...(来自我的 router.class.php)

    <?php
    
    $route = (empty($_GET['rt'])) ? '' : $_GET['rt'];
    $this->route = explode('/', $route);
    
    /*** a new controller class instance ***/
    $class = $this->controller . 'Controller';
    $controller = new $class($this->registry);
    
    /*** load arguments for action ***/
    $arguments = array();
    foreach ($this->route as $key => $val) 
    {
        if ($key == 0 || $key == 1)
        {
        }
        else
        {
            $arguments[$key] = $val;
        }
    }
    
    /*** execute controller action w/ parameters ***/
    call_user_func_array(array($controller, $action), $arguments);
    
    ?>
    

    如果我的网址是

    http://mysite.com/documentation/article/3
    

    我的控制器看起来像这样......

    <?php
    
    Class documentationController Extends baseController 
    {
    
        public function article($article_ID = '')
        {
            echo $article_ID; //shows 3
        }
    
    }
    
    ?>
    

    感谢您的帮助。

    【讨论】:

    • 我喜欢你的简单回答,但我不知道如何把它们放在一起。例如,我将您的代码放入我的 index.php 并在 baseController 上生成一个,找不到该类。你能再解释一下吗?
    【解决方案3】:

    简单地说,RewriteRules 处理这个。然而,在每个框架中都有更复杂的路由代码,将请求和数据定向到特定的控制器。

    我的建议是查看这些其他框架中的代码并研究它们如何解决这些问题。你提到的那些都是开源的。

    【讨论】:

    • 我在 .htaccess 文件中有一个 mod_rewrite,它“屏蔽”了一个 $rt 变量。我可以通过 $route[0]、$route[1] 等访问 URL 的路由。我想我真正的问题是如何将 URL 部分数组转换为上述格式的函数参数。我已经查看了 codeigniter 和 cakePHP 以及另一个框架,但我似乎无法找到创建这些参数变量的代码。
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 2016-01-22
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2014-03-09
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多