22
Июл
2021

как правильно сделать регулярное выражение для роута? php

сейчас не совсем корректно обрабатывается url если ввести несуществующий в роутах http://localhost/directors/g/2 http://localhost/dd/directors/2

и еще можно найти посмотрите на роуты и и на регулярное выражение к ним preg_match("~(?<![\w\d])$uriPattern(?![\w\d])~", $uri)

как его сделать правильным чтобы некорректные адреса выводились как 404

//Directors
        'director/([0-9]+)/delete' => 'DirectorController/actionDelete/$1',
        'director/([0-9]+)/edit' => 'DirectorController/actionUpdate/$1',
        'director/create' => 'DirectorController/actionCreate',
        'directors/page-([0-9]+)' => 'DirectorController/actionIndex/$1',
        'directors' => 'DirectorController/actionIndex',

//Router.php
<?php
namespace Components;
use \Controllers;
/**
 * Класс Router
 * Компонент для работы с маршрутами
 */
class Router {
    
    private $routes;
    
    public function __construct() {
        $routesPath = ROOT . '/routes/routes.php';
        $this->routes = include($routesPath);
    }
    
    /**
     * returns request string
     * @return type string
     */
    private function getUri() {
        $request = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING);
        if (!empty($request)) {
            return trim($request, '/');
        }
    }
    
    public function run() {
        //Получить строку запроса
        $uri = $this->getUri();
        $result = null;
        
        //Проверить наличие такого запроса в routes.php
        foreach ($this->routes as $uriPattern => $path){
            //Если есть совпадение определить какой контроллер и 
            //метод action обрабатывает запрос, параметры
            if (preg_match("~(?<![\w\d])$uriPattern(?![\w\d])~", $uri)) {
                // Получаем внутренний путь из внешнего согласно правилу.
                $internalRoute = preg_replace("~$uriPattern~", $path, $uri);
                
                $segments = explode('/', $internalRoute);
                $controllerName = array_shift($segments);
                $actionName = array_shift($segments);
                $parameters = $segments;
                
                //Получить обьект вызвать метод action
                $controllerName = "\\Controllers\\" . $controllerName;
                
                $controllerObject = new $controllerName;
                
                /* Вызываем необходимый метод ($actionName) у определенного 
                 * класса ($controllerObject) с заданными ($parameters) параметрами
                 */
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
                
                if ($result != null){
                    break;
                }
            }
           
        }
        if (!$result) {
            header("HTTP/1.0 404 Not Found");
        }
    }
}

Источник: https://ru.stackoverflow.com/questions/1307763/%D0%BA%D0%B0%D0%BA-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-%D1%80%D0%BE%D1%83%D1%82%D0%B0-php

Тебе может это понравится...

Добавить комментарий