我需要制作一個簡單的路由系統。
當我輸入localhost/user/login它需要轉到 UserController 檔案的 url 時,我需要重定向,并且與當你輸入localhost它需要轉到 HomeController時完全相同。
- 檢查請求的控制器是否存在,如果存在,“包含”它。
- 檢查請求的方法是否存在,如果存在,則呼叫它。
- 僅包含對該 URL 重要的控制器
- 如果控制器不存在,則列印 404 Not found 訊息。
- 如果該方法不存在,則列印 404 Not found 訊息。
- 還回傳 404 頁面的 404 狀態代碼。
它不斷給出/未定義變數的錯誤,當我進入頁面時,它不斷給出未定義的變數錯誤。
當更改為時$_server,$_SERVER它根本不起作用。這是它在使用時給出的錯誤$_server:
注意:未定義變數:_server in C:\xampp\htdocs\src\index.php 第 2 行
注意:嘗試訪問第 2 行 C:\xampp\htdocs\src\index.php 中 null 型別值的陣列偏移量
注意:未定義偏移量:1 in C:\xampp\htdocs\src\index.php 第 3 行
下面是我使用的檔案。
<?php
$linkExplode = explode("/", $_SERVER['REQUEST_URI']);
if (empty($linkExplode[1] && empty($linkExplode[2]))) {
$linkExplode[1] = 'Home';
$linkExplode[2] = 'index';
}
$controller = empty($linkExplode[1]) ? 'home' : $linkExplode[1];
$method = empty($linkExplode[2]) ? 'index' : $linkExplode[2];
if (file_exists('./Controllers/' . ucfirst($controller) . 'Homecontroller.class.php')) {
require('./Controllers/' . ucfirst($controller) . 'UserController.class.php');
$classname = ucfirst($controller) . 'Controller';
$class = new $classname();
if (method_exists($class, $method)) {
$class->$method();
} else {
http_response_code(404);
die;
}
} else {
http_response_code(404);
die;
}
家庭控制器
<?php
class HomeController
{
public function index()
{
echo 'De home pagina!';
}
}
用戶控制器
<?php
class UserController
{
public function login()
{
echo 'De login pagina!';
}
}
訪問權限
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(. )$ src/index.php?url=$1 [QSA,L]
DirectoryIndex src/index.php
當前 Var_Dumping $_SERVER 返還這個
array(58) { ["REDIRECT_MIBDIRS"]=> string(24) "C:/xampp/php/extras/mibs" ["REDIRECT_MYSQL_HOME"]=> string(16) "\xampp\mysql\bin" ["REDIRECT_OPENSSL_CONF"]=> string(31) "C:/xampp/apache/bin/openssl.cnf" ["REDIRECT_PHP_PEAR_SYSCONF_DIR"]=> string(10) "\xampp\php" ["REDIRECT_PHPRC"]=> string(10) "\xampp\php" ["REDIRECT_TMP"]=> string(10) "\xampp\tmp" ["REDIRECT_STATUS"]=> string(3) "200" ["MIBDIRS"]=> string(24) "C:/xampp/php/extras/mibs" ["MYSQL_HOME"]=> string(16) "\xampp\mysql\bin" ["OPENSSL_CONF"]=> string(31) "C:/xampp/apache/bin/openssl.cnf" ["PHP_PEAR_SYSCONF_DIR"]=> string(10) "\xampp\php" ["PHPRC"]=> string(10) "\xampp\php" ["TMP"]=> string(10) "\xampp\tmp" ["HTTP_HOST"]=> string(9) "localhost" ["HTTP_CONNECTION"]=> string(10) "keep-alive" ["HTTP_CACHE_CONTROL"]=> string(9) "max-age=0" ["HTTP_SEC_CH_UA"]=> string(64) ""Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"" ["HTTP_SEC_CH_UA_MOBILE"]=> string(2) "?0" ["HTTP_SEC_CH_UA_PLATFORM"]=> string(9) ""Windows"" ["HTTP_UPGRADE_INSECURE_REQUESTS"]=> string(1) "1" ["HTTP_USER_AGENT"]=> string(114) "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" ["HTTP_ACCEPT"]=> string(135) "text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" ["HTTP_SEC_FETCH_SITE"]=> string(10) "cross-site" ["HTTP_SEC_FETCH_MODE"]=> string(8) "navigate" ["HTTP_SEC_FETCH_USER"]=> string(2) "?1" ["HTTP_SEC_FETCH_DEST"]=> string(8) "document" ["HTTP_ACCEPT_ENCODING"]=> string(17) "gzip, deflate, br" ["HTTP_ACCEPT_LANGUAGE"]=> string(35) "nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7" ["HTTP_COOKIE"]=> string(36) "PHPSESSID=auct5lh5cga85hmln0o54kfjf4" ["PATH"]=> string(964) "C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;C:\Users\jeann\AppData\Local\Android\Sdk\emulator;C:\ProgramData\ComposerSetup\bin;C:\Users\jeann\AppData\Local\Microsoft\WindowsApps;C:\Users\jeann\AppData\Local\Programs\Microsoft VS Code\bin;C:\PHP;C:\MinGW\bin;C:\Users\jeann\AppData\Roaming\npm;C:\Users\jeann\Pictures\gradle-7.1.1\bin;C:\Users\jeann\AppData\Local\Android\Sdk\emulator;C:\Users\jeann\AppData\Local\Android\Sdk\tools;C:\Users\jeann\AppData\Local\Android\Sdk\platform-tools;C:\Users\jeann\AppData\Roaming\Composer\vendor\bin" ["SystemRoot"]=> string(10) "C:\WINDOWS" ["COMSPEC"]=> string(27) "C:\WINDOWS\system32\cmd.exe" ["PATHEXT"]=> string(53) ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC" ["WINDIR"]=> string(10) "C:\WINDOWS" ["SERVER_SIGNATURE"]=> string(95) "
Apache/2.4.46 (Win64) OpenSSL/1.1.1g PHP/7.4.11 Server at localhost Port 80
" ["SERVER_SOFTWARE"]=> string(47) "Apache/2.4.46 (Win64) OpenSSL/1.1.1g PHP/7.4.11" ["SERVER_NAME"]=> string(9) "localhost" ["SERVER_ADDR"]=> string(3) "::1" ["SERVER_PORT"]=> string(2) "80" ["REMOTE_ADDR"]=> string(3) "::1" ["DOCUMENT_ROOT"]=> string(15) "C:/xampp/htdocs" ["REQUEST_SCHEME"]=> string(4) "http" ["CONTEXT_PREFIX"]=> string(0) "" ["CONTEXT_DOCUMENT_ROOT"]=> string(15) "C:/xampp/htdocs" ["SERVER_ADMIN"]=> string(20) "postmaster@localhost" ["SCRIPT_FILENAME"]=> string(29) "C:/xampp/htdocs/src/index.php" ["REMOTE_PORT"]=> string(5) "51472" ["REDIRECT_URL"]=> string(11) "/user/login" ["REDIRECT_QUERY_STRING"]=> string(14) "url=user/login" ["GATEWAY_INTERFACE"]=> string(7) "CGI/1.1" ["SERVER_PROTOCOL"]=> string(8) "HTTP/1.1" ["REQUEST_METHOD"]=> string(3) "GET" ["QUERY_STRING"]=> string(14) "url=user/login" ["REQUEST_URI"]=> string(11) "/user/login" ["SCRIPT_NAME"]=> string(14) "/src/index.php" ["PHP_SELF"]=> string(14) "/src/index.php" ["REQUEST_TIME_FLOAT"]=> float(1636987064.7515) ["REQUEST_TIME"]=> int(1636987064) }
uj5u.com熱心網友回復:
首先,確保您的 HTACCESS 路線有效。如果確實如此并將您帶到正確的頁面,則進入下一步。
第二步在這里理解你的 PHP 代碼,你需要一些矛盾和修復。
<?php
$linkExplode = explode("/", $_SERVER['REQUEST_URI']);
//YOU CAN REMOVE THIS WHOLE IF STATEMENT
if (empty($linkExplode[1] && empty($linkExplode[2]))) {
$linkExplode[1] = 'Home';
$linkExplode[2] = 'index';
}
//You should check that the $linkExplode isset as well as not empty
$controller = isset($linkExplode[1]) && !empty($linkExplode[1]) ? $linkExplode[1] : "Home";
$method = isset($linkExplode[2]) && !empty($linkExplode[2]) ? $linkExplode[2] : "index";
// Here we remove the 'hardcoded HOME and USER from the string 'Controller.class.php'
// AND you also need to make sure that you require the same file your verifying is actually there.
if (file_exists('./Controllers/' . ucfirst($controller) . 'Controller.class.php')) {
require('./Controllers/' . ucfirst($controller) . 'Controller.class.php');
$classname = ucfirst($controller) . 'Controller';
$class = new $classname();
if (method_exists($class, $method)) {
$class->$method();
} else {
http_response_code(404);
die;
}
} else {
http_response_code(404);
die;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/364347.html
