Простая маршрутизация PHP не работает

Извините, я новичок, поэтому, возможно, вопрос просто мелочь.
На данный момент я пытаюсь реализовать простую маршрутизацию. Я нашел учебник (извините, это на немецком языке: https://steampixel.de/einfaches-und-elegantes-url-routing-mit-php/ )

Проблема в том,:
Если я позвоню www.myproject.at / я ожидаю, что я должен увидеть свой шаблон для этого пути, но я просто вижу страницу 404.
Я не могу найти свою ошибку, но я думаю, что это ошибка htaccess.

Я использую apache 2.4 и мой vhost очень прост.
У меня есть все myprojects в /var / www
Фактический корневой каталог (где мой индекс.php is) is / 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]

Конфиг.РНР

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;
}

Маршрут.РНР

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));
        }
    }
}

Указатель.РНР

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();

Спасибо всем!
И извините за длинный пост, и если это просто глупый вопрос.

1 ответ

  1. Прежде всего , вы не можете использовать array_key_exists с массивами likearray(1, 2, 3), они работают только с массивами like 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;
    ?>