Простой аргумент маршрутизатора PHP, передаваемый в представления - PullRequest
0 голосов
/ 28 октября 2018

Я создаю базовый маршрутизатор на 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

1 Ответ

0 голосов
/ 28 октября 2018
Глобальная переменная

будет работать, потому что require не является перенаправлением, но, поскольку вы находитесь в области действия функции, вам нужно будет перечислить эти глобальные переменные для общего доступа к ним, но я не уверен, хорошая ли это идея

// index.php

$var = 'global';

...

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

...

// home.php

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

лучше использовать ООП и передавать данные через параметры

edit: если вы спрашиваете, как передавать переменную между файлами, то вышеприведенное хорошоДело в том, что когда вы смотрите на файл кода представления, через некоторое время вы не будете знать, откуда переменная приходит, и это заставляет вас читать больше исходных файлов (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 скажет вам где

...