我正在用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
答案 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会告诉您在哪里