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

Plain PHP router argument passing to views

我正在 PHP 中创建一个基本路由器,关于如何编写普通 PHP 路由器的在线内容不多 material。所以下面是我当前的实现。基本上每个请求都被重定向到 index.php,然后它使用 class 路由器将用户重定向到 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

全局变量可以工作,因为 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 将告诉你在哪里