【问题标题】:PHP MVC pass multiple parametersPHP MVC 传递多个参数
【发布时间】:2020-12-29 22:59:23
【问题描述】:

由于缺乏 PHP 编程经验,我很难理解如何在 URL 中传递多个参数。

我有以下 URL http://some.domain/examr/pages/listQuestions/1/OSPF,其目的是将最后 2 个参数传递给 listQuestions 控制器函数,但是,只有一个被传递。 URL 被改写为$_GET['URL']

我的框架有一个 core.php 文件,其中包含用于将 URL 基本上拆分为数组(或者我应该说是爆炸)并加载控制器的方法和属性的核心类。

class Core {

protected $currentController = 'Pages';
protected $currentMethod = 'index';
protected $params = [];

public function __construct(){
    //print_r($this->getUrl());
    $url = $this->getUrl();
    
    //look in controllers for index 0
    if(!empty($url) && file_exists('../app/controllers/' .ucwords($url[0]). '.php')){
        //If exits set as current controller
        $this->currentController = ucwords($url[0]);
        // unset index 0
        unset($url[0]);
    }
    
    //require controller
    require_once '../app/controllers/' . $this->currentController . '.php';
    
    //instantiate controller class
    $this->currentController = new $this->currentController;
    
    // check for url index [1]
    
    if(isset($url[1])){
        if(method_exists($this->currentController, $url[1])){
            $this->currentMethod = $url[1];
            unset($url[1]);
        }
    }
    
    // get params
    $this->params = $url ? array_values($url) : [];
    //callback function
    call_user_func_array([$this->currentController, $this->currentMethod], $this->params);
}

public function getUrl(){
    if(isset($_GET['url'])){
        $url = rtrim($_GET['url'], '/');
        $url = filter_var($url, FILTER_SANITIZE_URL);
        $url = explode('/', $url);
        return $url;
    }
}

}

我在$this->params 上使用了print_r 函数,我可以看到它正在获取所有的URL 参数,到目前为止我觉得很好:-)

此外,我还有另一个文件,其中包含用于加载模型和视图的基本控制器。

class Controller {
 //load models
 
 public function model($model){
     //require model file
     require_once '../app/models/' . $model . '.php';
     //instantiate model
     return new $model();
 }
 
 //load views
 public function view($view, $data = []){
     // check if view file exist
     if(file_exists('../app/views/' . $view . '.php')){
         require_once '../app/views/' . $view . '.php';
     } else {
         die('View does not exist' . $view);
        
     }
 }
 
 }

这一切都集中在一个加载核心和基本控制器的引导文件中,该文件加载在 index.php 文件中并实例化类核心。

从前面的 URL 可以看出,我有一个名为 pages 的控制器,它扩展了基本控制器,并希望将最后 2 个 URL 参数传递给函数 listQuestions(即 w.i.p)。

public function listQuestions($params){
    print_r($params);
    $exam_id = $params;
    $questions = $this->dbModel->listQuestions($exam_id);
    $data = [
            'description' => 'exam details',
            'questions' => $questions
        ];
    if($questions != 0){
        $this->view('pages/listQuestions', $data);
    }
    
    print_r($questions);
}

我可以从print_r($params); 看到只有 1 个参数被传递,我不知道我的错误在哪里,也不知道如何进一步解决这个问题。

我还有以下重写规则

<IfModule mod_rewrite.c>
  Options -Multiviews
  RewriteEngine On
  RewriteBase /examr/public
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule  ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>

感谢任何帮助。

【问题讨论】:

  • 我看不出$_GET['url'] 有什么价值,也许$_SERVER['REQUEST_URI']
  • 什么意思?
  • 什么是$_GET['url'] 如果存在,则必须由重写规则填充。
  • URL var 在重写规则中定义

标签: php url model-view-controller parameters


【解决方案1】:

call_user_func_array 将数组作为参数并将其提取 为单独的参数。所以在这种情况下,它会传递两个参数:

$this->Controller->listQuestions(1, 'OSPF'); 

您希望call_user_func 传递一个数组参数:

call_user_func([$this->currentController, $this->currentMethod], $this->params);

从 PHP 7 开始,您可以这样称呼它:

[$this->currentController, $this->currentMethod]($this->params);

之前:

    $func = array($this->currentController, $this->currentMethod]);
    $func($this->params);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2013-11-21
    • 2021-11-05
    • 2011-01-13
    • 2012-02-12
    相关资源
    最近更新 更多