0

我正在用 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 将有权访问该全局变量并可以使用它。

项目文件系统:

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

1 回答 1

0

全局变量将起作用,因为require不是重定向,但是由于您处于函数范围内,因此您必须将这些全局变量列出以对其进行全面访问,但我不确定这是否是个好主意

// 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 会告诉您在哪里

于 2018-10-28T09:42:55.727 回答