抱歉,我是初学者,所以问题可能只是一件小事。 目前我尝试实现一个简单的路由。我发现了一个教程(抱歉,它是德语:https://steampixel.de/einfaches-und-elegantes-url-routing-mit-php/)
问题是: 如果我打电话给www.myproject.at/我希望我能看到我的模板这个路径,但我只看到404页面。 我找不到自己的错误,但我认为这是一个错误的错误。
我使用apache 2.4,我的vhost非常简单。 我在/ var / www中有所有myprojects 实际的根目录(我的index.php所在的位置)是/ var / www / PROJECT / www / 所以我配置了vhost。
我的htaccess
DirectoryIndex index.php
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA, L]
的config.php
private static $registry = Array();
public static function set($key, $value) {
self::$registry[$key] = $value;
}
public static function get($key) {
if (array_key_exists($key, self::$registry)) {
return self::$registry[$key];
}
return FALSE;
}
Route.php
public static $routes = Array();
public static $routes404 = Array();
public static $path;
public static function init() {
// cut url
$parsedUrl = parse_url($_SERVER['REQUEST_URI']);
if (isset($parsedUrl['path'])) {
self::$path = trim($parsedUrl['path'], '/');
} else {
self::$path = '';
}
}
public static function add($expression,$function) {
array_push(self::$routes,Array(
'expression' => $expression,
'function' => $function
));
}
public static function add404($function) {
array_push(self::$routes404,$function);
}
public static function run(){
$routeFound = FALSE;
foreach(self::$routes as $route){
if(Config::get('basepath')) {
$route['expression'] = '('.Config::get('basepath').')/'.$route['expression'];
}
//Add 'find string start' automatically
$route['expression'] = '^'.$route['expression'];
//Add 'find string end' automatically
$route['expression'] = $route['expression'].'$';
//check match
if(preg_match('#'.$route['expression'].'#',self::$path,$matches)) {
//echo $expression;
array_shift($matches);//Always remove first element. This contains the whole string
if(Config::get('basepath')) {
array_shift($matches);//Remove Basepath
}
call_user_func_array($route['function'], $matches);
$route_found = TRUE;
}
}
if($routeFound == FALSE) {
foreach(self::$routes404 as $route404) {
call_user_func_array($route404, Array(self::$path));
}
}
}
的index.php
require_once './core/vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('./core/templates');
$twig = new Twig_Environment($loader, array(
'cache' => './cache',
'auto_reload' => 'true', # If it’s set to false, the templates will be reloaded only if you delete the contents of the cache directory
));
// includes for routing
include('core/php/Config.php');
include('core/php/Route.php');
// Config
Config::set('basepath','/');
// init routing
Route::init();
// base Route
Route::add('/', function() use ($twig) {
$template = $twig->loadTemplate('surrounding.html');
$template->display([]);
});
Route::add404(function($url) use ($twig) {
//Send 404 Header
header("HTTP/1.0 404 Not Found");
$template = $twig->loadTemplate('404.html');
$template->display([]);
});
Route::run();
感谢大家! 对于长篇文章感到抱歉,如果这只是一个愚蠢的问题。
答案 0 :(得分:0)
首先,您不能将array_key_exists与array(1, 2, 3)
这样的数组一起使用,它们只适用于像array(1 => 2, 3 => 4)
这样的数组。原因是如果你在像array('hello', 'nice', 'crazy', 'lord')
这样的数组上使用它,它将返回0,1,2,3而不是实际值。与其他类型的数组一起,它将返回值,我建议使用in_array使代码工作。
例如:
<?php
if (in_array($key, self::$registry)) {
return self::$registry[$key];
}
return FALSE;
?>