2015-03-11 1 views
2

Я работаю над простым маршрутизатором для практики php, он уже развивается совсем немного, но я отправляю более упрощенную версию.Как исправить этот класс маршрутизатора, чтобы включить 404 ошибки/страницы?

Класс моего маршрутизатора проверяет данный URL-адрес и текущий путь к серверу и возвращает содержимое, если они совпадают. Это прекрасно работает, но проблема в том, что маршрутизатор работает 3 раза, потому что я вызываю метод get() маршрутизатора 3 раза в файле routes.php.

Если я, например, хочу вернуть ошибку 404, когда маршрут не соответствует, он вернет его 3 раза. 1 раз для каждого маршрута не найден. Каков наилучший способ исправить это?

Как всегда, ваша помощь очень ценится.

маршрутизатор класса:

<?php 
class Router { 
    public $currentRoute = '/'; 
    public function __construct() 
    { 
     $this->getCurrentRoute(); 
    } 
    public function getCurrentRoute() 
    { 
     if(isset($_SERVER['PATH_INFO'])) { 
      $this->currentRoute = $_SERVER['PATH_INFO']; 
     } 
    } 
    public function get($route, $content) 
    { 
     if($route == $this->currentRoute) { 
      echo $content(); 
     } 
    } 
} 

Маршруты Файл:

<?php 

$router->get('/', function() 
{ 
    return 'Index page'; 
}); 

$router->get('movies', function() 
{ 
    return Cinematix\View::make('movies'); 
}); 

$router->get('users', function() 
{ 
    return 'The users collection page'; 
}); 
+0

Я думаю, это должно было бы быть переписана в значительной степени осуществить это в другом вопросе, так как никто не ответил я буду стараться обновлять это с возможным решением, которое кто-то может мне помочь. –

+0

Я бы переписал его с помощью Маршрутов, соединяющих Маршруты внутри него. Поэтому вместо того, чтобы получить, вы добавите маршруты и после этого проверите их все в одном цикле внутри маршрутизатора. Я верю, что большинство маршрутизаторов в популярных фреймворках сделаны. – SeriousDron

ответ

1

Сначала следует предупредить, что ваш подход не рекомендуется. Взгляд классика MVC programming pattern - хороший способ начать.

Читайте дальше, если вы действительно хотите сделать это так, как вы начали использовать анонимные обратные вызовы. Класс

Маршрутизатор:

class Router { 
    public $currentRoute = '/'; 
    private $routes; 

    public function __construct($routes) 
    { 
     $this->routes = $routes; 
     $this->getCurrentRoute(); 
    } 
    public function getCurrentRoute() 
    { 
     if(isset($_SERVER['PATH_INFO'])) { 
      $this->currentRoute = $_SERVER['PATH_INFO']; 
     } 
    } 
    public function route() 
    { 
     $route = $this->currentRoute; 

     if (!isset($this->routes[$route])) { 
      $route = '/404'; 
     } 

     if (is_callable($this->routes[$route])) 
     { 
      echo $this->routes[$route](); 
     }  
    } 
} 

маршруты Файл:

$routes = array(
    '/' => function() 
    { 
     return 'Index page'; 
    }, 
    '/movies' => function() 
    { 
     return 'Movies'; 
    }, 
    '/users' => function() 
    { 
     return 'The users collection page'; 
    }, 
    '/404' => function() 
    { 
     return '404'; 
    } 
); 

$router = new Router($routes); 
$router->route(); 
1

Простое решение может быть объявить статический флаг в своем классе. Скажем

<?php 
class Router { 
    static $found = 0; 
    public $currentRoute = '/'; 

Затем в routes.php вы идете, как:

$router->get('/', function() 
{ 
    Router::$found = 1; 
    return 'Index page'; 
}); 

$router->get('movies', function() 
{ 
    Router::$found = 1; 
    return Cinematix\View::make('movies'); 
}); 

$router->get('users', function() 
{ 
    Router::$found = 1; 
    return 'The users collection page'; 
}); 

if (!Router::$found) { 
    $router->get('404', function() 
    { 
     return '404 page'; 
    }); 
} 

Теперь, '404' должен быть объявлен 'путь' в классе маршрутизатора.

Смежные вопросы