@cahe4a1

Как сделать 404 ошибку в Роутере — PHP?

Коллеги! Как сделать проверку в файле Router.php - чтобы когда при заходе на любую неправильную ссылку вместо белого экрана была 404 ошибка. На данный момент из-за роута типа 'category/([-a-z]+)' => 'catalog/category/$1', при вводе любой неправильной ссылки типа site/category/errorlinkkk - выводит категорию без нужных значений. Нужно чтобы срабатывала 404 ошибка. Код учебный, реализую для своего проекта и тренируюсь. С уважением, Александр!

Файл Router.php

class Router {
    
    private $routes; //массив, в котором будут храниться роуты
    
    public function __construct() {
        
        $routesPath = ROOT.'/config/routes.php'; //путь к роутам
        $this->routes = include($routesPath);
        
    }
    
    private function getURI() {
        
        if (!empty($_SERVER['REQUEST_URI'])) {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    
    public function run() {
        
        //Получить строку запроса
        $uri = $this->getUri();
 
        //Проверка наличие такого запроса в routes.php
        foreach($this->routes as $uriPattern => $path) {  
            
            //Сравниваем $uriPattern и $uri
            if (preg_match("~^$uriPattern$~", $uri)) {
            
                //Получаем внутренний путь из внешнего согласно правилу
                $internalRoute = preg_replace("~$uriPattern~", $path, $uri);
                //Определить какой контроллер и метод обрабатывает запрос
                $segments = explode('/', $internalRoute);
                //Получить имя контроллера
                $controllerName = ucfirst(array_shift($segments)).'Controller';
                //Получить имя метода
                $actionName = 'action'.ucfirst(array_shift($segments));
                //Подключить файл класса контроллера
                $controllerFile = ROOT . '/controllers/' . $controllerName . '.php';
                if (file_exists($controllerFile)) {
                    include_once($controllerFile);
                }
                //Создать объект, вызвать метод
                $parameters = $segments;
                $controllerObject = new $controllerName;
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
                if($result != null) {
                    break;
                }
            }
        }
    }
}


Часть кода из routes.php

return array(
    // Товар:
    'product/([-a-z]+)' => 'product/view/$1', // actionView в ProductController
    // Каталог:
    'catalog' => 'catalog/index', // actionIndex в CatalogController
    // Категория товаров:
    '([0-9]+)/page-([0-9]+)' => 'catalog/category/$1/$2', // actionCategory в CatalogController   
    'category/([-a-z]+)' => 'catalog/category/$1', // actionCategory в CatalogController
);
  • Вопрос задан
  • 668 просмотров
Пригласить эксперта
Ответы на вопрос 1
@cahe4a1 Автор вопроса
Подсказали такой код, но не могу догнать что нужно сравнить, чтобы вывести файл ошибки

if (basename($_SERVER['SCRIPT_FILENAME']) == basename(__FILE__)) {
    header('Location: error404.php');
    exit;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы