普通的PHP路由器参数传递给视图

时间:2018-10-28 07:19:24

标签: php backend cakephp-routing

我正在用PHP创建一个基本的路由器,关于如何编写普通的PHP路由器的在线资料并不多。所以下面是我当前的实现。基本上,每个请求都重定向到index.php,然后使用类路由器将用户重定向到home.php或add.php。问题是如何将index.php中的任何类型的变量传递给home.php或add.php?

<?php
//***********************
// Router class
//*********************
class router
{
  public $req = [];
  public $url = "";
  public $method = "";
  private $url_found = false;

  public function resolve($url)
  {
    $this->url = $url["REDIRECT_URL"];
    $this->request = $url;
    $this->method = $url["REQUEST_METHOD"];
  }

  public function get($route, $callback)
  {
    if ($this->method == "GET" && $this->url == $route && $this->url_found == false) {
      $url_found = true;
      $callback($this->req);
    }
  }

  public function post($route, $callback)
  {
    if ($this->method == "POST" && $this->url == $route && $this->url_found == false) {
      $url_found = true;
      $callback($this->req);
    }
  }
}



<?php
//*******************************
// index.php
//*********************************


require './router.php';

$app = new router();

$app -> resolve($_SERVER);

   $app -> get("/home", function ($req)
{
  require 'views/home.php';
});

$app -> get("/add", function ($req)
{
  require 'views/add.php';
});

$app -> post("/add", function ($req)
{
  require 'views/home.php';
});

我的想法是我需要保存要传递一些全局变量的数据,如果我要求说“ views / home.php”,home.php将可以访问该全局变量并可以使用它。 / p>

项目文件系统:

+---php_router
|   |   .htaccess
|   |   index.php
|   |   notes.md
|   |   router.php
|   |
|   \---views
|           add.php
|           home.php

1 个答案:

答案 0 :(得分:0)

全局变量将起作用,因为require不会被重定向,但是由于您处于函数范围内,因此必须列出这些全局变量才能对其进行大规模访问,但是我不确定那是否是个好主意< / p>

// index.php

$var = 'global';

...

$app -> get("/home", function ($req)
{
    global $var;
    require 'views/home.php';
});

...

// home.php

var_dump($var);
var_dump($req);

更好的是OOP方法并通过参数传递数据

修改: 如果只问如何在文件之间传递变量,那么上面的方法就很好了,那就是当您查看查看文件的代码时,过了一段时间,您将不知道变量从何处来,这迫使您读取更多的源文件(IDE不会告诉您变量的定义位置)。

考虑这一点:

$app -> get("/home", function ($req)
{
    global $var;
    require 'views/home.php';
    $view = new Home($var);
});

class Home {
    private $var;
    public function __construct($var){
        $this->var = $var;
    }
    public function render(){
        echo $this->var;
    }
}

从这个角度来看,您会立即看到存在变量var,并且它来自构造函数,没有混淆,唯一可以通过变量的方式是对象创建,这很容易找到,IDE会告诉您在哪里