Я создаю базовый маршрутизатор на 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
Глобальная переменная будет работать, потому что require
не перенаправляет, но так как вы находитесь в области действия функции, вам нужно будет перечислить эти глобальные переменные для общего доступа к ним, но я не уверен, что это хорошая идея
// index.php
$var = 'global';
...
$app -> get("/home", function ($req)
{
global $var;
require 'views/home.php';
});
...
// home.php
var_dump($var);
var_dump($req);
лучше подход ООП и передача данных через параметры
редактировать:
если вы спросите, как передать переменную между файлами, то все в порядке, дело в том, что когда вы посмотрите на файл кода представления, через некоторое время вы не будете знать, откуда переменная приходит, и это заставляет вас читать больше исходных файлов. (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 скажет вам, где
Других решений пока нет …