简体   繁体   English

PHP MVC传递多个参数

[英]PHP MVC pass multiple parameters

Due to my lack of PHP programming experience, I am finding it hard to understand how I can pass multiple parameters in URL.由于我缺乏 PHP 编程经验,我很难理解如何在 URL 中传递多个参数。

I have the following URL http://some.domain/examr/pages/listQuestions/1/OSPF where the objective is to pass the last 2 parameters to the listQuestions controller function, however, only one is being passed. I have the following URL http://some.domain/examr/pages/listQuestions/1/OSPF where the objective is to pass the last 2 parameters to the listQuestions controller function, however, only one is being passed. The URL is rewritten into $_GET['URL'] . URL 被重写为$_GET['URL']

My framework has a file core.php file which holds the core class used to basically split the URL into an array (or should I say explode) and loads the methods and properties of the controller. My framework has a file core.php file which holds the core class used to basically split the URL into an array (or should I say explode) and loads the methods and properties of the controller.

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;
    }
}

}

I have used the print_r function on the $this->params and I can see it is picking up all the URL parameters, so far I guess so good:-)我在$this->params上使用了print_r function ,我可以看到它正在获取所有 URL 参数,到目前为止我想很好:-)

In addition I have another file that holds the base controller which is used to load the models and the views.此外,我还有另一个文件,其中包含用于加载模型和视图的基本 controller。

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);
        
     }
 }
 
 }

This all comes together in a bootstrap file that loads both the core and base controller, which is loaded in an index.php file and instantiates the class core.这一切都汇集在一个引导文件中,该文件加载核心和基础 controller,该文件加载到 index.php 文件中并实例化 class 核心。

From the previous URL you can see that I have a controller named pages which is extending the base controller and would like to pass the last 2 URL params to the function listQuestions (which is wip). From the previous URL you can see that I have a controller named pages which is extending the base controller and would like to pass the last 2 URL params to the function listQuestions (which is wip).

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);
}

I can see from the print_r($params);我可以从print_r($params); that only 1 param is being passed and I have no idea where my mistake is or how can I troubleshoot this further.只传递了 1 个参数,我不知道我的错误在哪里,也不知道如何进一步解决这个问题。

I have also the following rewrite rule我也有以下重写规则

<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>

Any help is appreciated.任何帮助表示赞赏。

call_user_func_array takes an array as an argument and extracts it into individual arguments. call_user_func_array将数组作为参数并将其提取到单独的 arguments 中。 So in this case it would pass two arguments:所以在这种情况下,它将通过两个 arguments:

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

You want call_user_func to pass a single argument which is an array:您希望call_user_func传递一个数组参数:

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

Since PHP 7 you can call it like this:由于 PHP 7 你可以这样称呼它:

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

Earlier:早些时候:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM